springcloud学习笔记
2018-07-27
本文参考:
蚂蚁课堂教程余胜军教程;
http://blog.csdn.net/forezp/article/details/70148833 方志朋的博客
正文
springcloud主要包含组建:eureka,ribbon,feign,hystrix,zuul,config,zookeeper;
一般项目只需要:eureka,feign,hystrix,config;就可以组建;这里也简单使用这几个组建学习;
1 eureka是服务注册与发现
eureka包含两部分,1服务注册中心,2服务客户端包含生产者和消费者两种;
服务注册中心是负责发现管理各种服务接口的中心;所有生产者和消费者都必须注册到本中心才可以被使用;注册中心设置非常简单,只需要在一个springboot项目上加入简单注解开启服务即可;接下来就是在配置文件中加入相关配置:如下
#这里是注册中心;
server:
port: 8761
spring:
application:
#这个名字是注册中心显示的服务名称;
name: eureka1
eureka:
instance:
#这个主机名一般没有用;服务注册时需要的是IP;
hostname: cloudserver
#开启关闭自我保护功能;默认是ture,
#自我保护是指当服务心跳超时时是否保留服务注册信息;开启后会保留注册信息;关闭后当服务心跳超时则剔除对应注册信息;
server:
enable-self-preservation: false
#设置本节点为服务注册中心;需要关闭fetch-registry;和register-with-eureka;这就是关闭这个客户端的注册申请,让他作为server; 这个是单例模式;如果是高可用就不需要设置这两项;
client:
# fetch-registry: false
# register-with-eureka: false
# 指定本服务注册目标地址;可以使用","分隔多个地址;
service-url:
defaultZone: http://localhost:9991/eureka/,http://localhost:9992/eureka/
#eureka是springcloud的注册中心;是服务发布中心;可是实现高可用;这里只作为demo单实例运行;
注意缩进;这里不是很明显;
服务生产者就是简单的springboot项目;只需要在入口类上加上相关注解,在配置文件中加入配置即可;
@EnableEurekaClient//表示开启生产者模式;
配置文件如下:
#这里是生产者;
server:
port: 8762
spring:
application:
name: service-hi #本name是在注册中心注册的名称,也是其他消费者访问时的名称;
#只需要在springboot项目中加入一下配置就可以成功将服务注册到eureka服务中心;
eureka:
client:
serviceUrl:
#指定注册中心地址;
defaultZone: http://localhost:8761/eureka/
#设置心跳和熔断时间;
# instance:
# lease-renewal-interval-in-seconds: 2
# lease-expiration-duration-in-seconds: 3
服务消费者就是调用服务的客户端;这里稍微复杂一点;这里使用feign客户端模式;feign自带负载均衡;使用更加方便;
首先在主类上加入注解开启服务框架;
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
然后编写接口调用服务:
/**
* 消费者通过接口注解方式消费;
*
*@FeignClient注解的两个属性意思是:value是值调用服务的名称,fallback是调用失败返回接口类;
*
* @author [email protected]
* @date 2018年7月5日
*/
@FeignClient(value="service-hi",fallback=SchedualServiceHiHystric.class)
public interface SchedualServiceHi {
@RequestMapping(value="/hi",method=RequestMethod.GET)
String sayHiFromClientOne(@RequestParam(value="name")String name);
}
/**
* 当消费者请求超时时返回本类信息;
* 本类需实现消费接口;每个方法重写一个超时信息;
* @author [email protected]
* @date 2018年7月5日
*/
@Component
class SchedualServiceHiHystric implements SchedualServiceHi {
@Override
public String sayHiFromClientOne(String name) {
return "sorry "+name;
}
}
然后controller层就可以把这里当作服务层调用了;
配置文件:
#这里是消费客户端;
server:
port: 8765
servlet:
context-path:
spring:
application:
name: service-feign
#指定注册地址;
eureka:
client:
serviceUrl:
defaultZone: http://192.168.3.167:9991/eureka/,http://localhost:9992/eureka/
#启用熔断机制;
feign:
hystrix:
enabled: true
注册简单认证:
1、 服务端添加依赖
2 服务端配置:
添加security依赖后默认开启密码认证;如不设置用户名密码会在日志输出user的默认密码需要仔细查找;所以还是设置好密码较好;设置如下:
spring:
security:
user:
name: xxxx
password: xxxx
roles: user
另外,最新springcloud默认开启csrf;所以需要关闭;添加配置类如下:
3 客户端配置:
在配置的 defaultZone: http://192.168.3.167:9991/eureka/,http://localhost:9992/eureka/
的IP前面加上用户名密码,如: http://user:[email protected]:9991/eureka/
二 hystrix断路器
feign自带断路器;但是默认是关闭的;这里需要在配置文件开启,如上面这个配置文件的#启动熔断机制配置;
三 config配置中心
配置中心可以是实现远程配置,这里支持配置文件在git或gitee上;它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。
这里需要两个角色;一个是config server,一个是configclient;
server同样只需要在主类注解开启;然后编写配置文件即可;
@SpringBootApplication
@EnableConfigServer
server:
port: 8888
spring:
application:
name: config-server
cloud:
config:
server:
git:
#仓库地址;
uri: https://gitee.com/clouds234/springcloud configfile.git
#搜索目录;还不清楚具体情况;
search-paths: respo
#仓库用户名密码
username:
password:
#配置文件分支;
label: master
client端直接配置文件编写就可以了;这里为了证明的确读取了配置文件;特地设置一个自定义变量,通过访问改变了证明是读取的远端配置文件;
spring:
application:
name: config-client
cloud:
config:
#配置文件所在分支;
label: master
#配置文件版本;
profile: dev
#配置服务位置;
uri: http://localhost:8888/
#配置重试,默认重试6次,最初延迟1s;后续是前一次的1.2倍;
retry:
initial-interval: 2000
max-attempts: 6
max-interval: 4000
multiplier: 1.5
server:
port: 8881
证明读取远端配置文件的实例:
在远端git仓库添加文件:config-client-dev.properties文件内容为:foo = foo version 3
在client端controller层添加如下代码:!!!注意;在本项目配置文件中是没有foo变量的;
@Value("${foo}")
String foo;
@RequestMapping(value = "/hi")
public String hi(){
return foo;
}
通过浏览器访问可以看到:
foo version 3
结果总结:使用远端控制的表现就是,git中的配置文件内容可以直接当作cli端配置文件使用;无需在cli配置文件中添加其他内容;
四 zuul路由网关
路由网关可以实现负责均衡和安全过滤;
zuul作为反向代理服务器;可以对老服务进行转发到新服务区;
关于zuul的知识非常多,而且对于大型分布式微服务架构非常重要;
另见
五 服务访问鉴权
在微服务架构中,每个服务的权限控制是相对单实例来说复杂的多的;目前比较简单使用的框架有两个,一个是jwt,一个是oauth2;两种方式基本都是基于token的方式完成的,单两种又有不同的优势;还有一种是使用私钥的方式;当然对于安全要求较低的系统,可以在内网进行宽泛权限认证;
六 feign日志
Feign日志记录
为每个创建的Feign客户端创建一个记录器。默认情况下,记录器的名称是用于创建Feign客户端的接口的完整类名。Feign日志记录仅响应DEBUG级别。
application.yml
logging.level.project.user.UserClient: DEBUG
您可以为每个客户端配置的Logger.Level对象告诉Feign记录多少。选择是:
NONE,无记录(DEFAULT)。
BASIC,只记录请求方法和URL以及响应状态代码和执行时间。
HEADERS,记录基本信息以及请求和响应标头。
FULL,记录请求和响应的头文件,正文和元数据。
例如,以下将Logger.Level设置为FULL:
@Configuration
public class FooConfiguration {
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
七 Spring Cloud Stream
Spring Cloud Stream是构建消息驱动的微服务应用程序的框架。
Spring Cloud Stream为Kafka和Rabbit MQ提供Binder实现。
具体使用方法参见:
https://springcloud.cc/spring-cloud-dalston.html#_declaring_and_binding_channels
springcloud stream目录;
使用kafka或者rabbitmq都可以使用maven坐标导入对应的驱动程序;