构建服务治理——Eureka
-
搭建服务注册中心
1、在pom.xml中引入spring-cloud-starter-eureka-server依赖
2、在启动类添加@EnableEurekaServer注解
3、在application.yml中增加一些配置,如下:
#服务器允许端口号
server.port=8260
#Eureka相应的配置
#是否将服务注册到服务治理服务器上,false不注册
eureka.client.register-with-eureka=false
#应用启动后不需要从Eureka服务器中同步已注册的服务注册列表数据到本地
eureka.client.fetch-registry=false
-
搭建服务提供者——注册服务
1、在pom.xml中引入spring-cloud-starter-eureka依赖
2、在启动类添加@EnableDiscoveryClient注解,通过该注解,在Spring Boot启动之后,会根据配置中的信息尝试与服务治理服务器进行连接,连接成功后进行服务注册或服务注册信息的同步。
3、在application.yml中增加一些配置,如下:
#用户服务器的端口号
server.port=2100
#用户微服务的应用名/服务ID
spring.application.name=userService
#Eureka相应的配置
#是否将服务注册到服务治理服务器上,true注册
eureka.client.register-with-eureka=true
#应用启动后需要从Eureka服务器中同步已注册的服务注册列表数据到本地
eureka.client.fetch-registry=true
#设置服务注册中心的URL,本服务要向该服务注册中心注册自己
eureka.client.serviceUrl.defaultZone=http://localhost:8260/eureka
注意:一个服务实例注册到Eureka服务器时大概需要30秒才能在控制台中查看到该服务。这是因为,Eureka要求服务提供者必须送达3次心跳(默认每次心跳间隔10秒)后才认为该服务实例已经准备好,可以对外提供服务了。因此,当启动完一个服务实例时,在Eureka控制台中没有立即显示是正常的。
-
搭建服务消费者——获取服务
1、在pom.xml中引入spring-cloud-starter-eureka依赖
2、在启动类添加@EnableDiscoveryClient注解,通过该注解,在Spring Boot启动之后,会根据配置中的信息尝试与服务治理服务器进行连接,连接成功后进行服务注册或服务注册信息的同步。
3、在application.yml中增加一些配置,如下:
#商品服务器的端口号
server.port=2200
#商品微服务的应用名/服务ID
spring.application.name=productService
#Eureka相应的配置
#是否将服务注册到服务治理服务器上,true注册
eureka.client.register-with-eureka=true
#应用启动后需要从Eureka服务器中同步已注册的服务注册列表数据到本地
eureka.client.fetch-registry=true
#设置服务注册中心的URL,本服务要向该服务注册中心注册自己
eureka.client.serviceUrl.defaultZone=http://localhost:8260/eureka
4、如何在商品服务器中调用用户服务?在Spring Cloud中提供了多种实现方式,通过RestTemplate来调用
-
深入理解Eureka
1、在分布式系统领域有个CPA原理(布鲁尔定理),不能同时满足一致性、可用性、分区容忍性。
2、对于大多数分布式环境,尤其涉及数据存储的场景,数据一致性是首先要保证的,像zookeeper采用的设计原则是CP原则,即任何时刻对zk的
2、对于服务治理来说,核心就是服务的注册和发现。
API网关服务——zuul
1、提供统一的入口供客户端访问
2、借助API服务网关可统一做切面任务,避免每个微服务自己开发,使系统更加标准化
3、API服务网关需要实现一个高可用伸缩性强的服务,避免单点失效。
-
zuul的路由功能
负责将外部请求转发到具体的微服务实例上,是外部网文统一入口的基础。
zuul支持与Eureka的整合,可以动态对注册到Eureka中的微服务进行路由映射。
zuul提供多种机制对请求路由进行映射:
1、与Eureka服务器整合自动根据微服务的ID进行映射
2、结合微服务ID通过自定义的方式进行路由映射
3、用静态url路径的方式对微服务进行路由映射
4、添加全局路由映射
5、通过自定义路由转换器,实现灵活的路由映射
路由配置动态加载:
Spring Cloud Config子项目提供了配置文件的统一管理,我们需要将src/main/resources目录下的配置文件application.properties或yml文件抽出来统一存放在版本管理服务器上,然后将zuul的配置从统一配置服务器中进行加载。
当需要修改路由映射规则时,就需要修改后的配置文件提交到Git仓库上,然后在zuul中使用/refresh重新加载配置。
-
zuul过滤器
zuul包含两个功能:路由和过滤器。
1、路由的功能是负责将外部的请求转发到具体的微服务实例。
2、过滤器的功能是负责对请求的处理过程进行干预,是实验请求校验。
zuul路由映射和请求转发是由几个不同的过滤器组合完成的,所以说zuul的过滤器才是核心所在。
-
@EnableZuulServer与@EnableZuulProxy比较
1、@EnableZuulServer注解的过滤器包括pre类型的过滤器、route类型的过滤器、post类型的过滤器、error类型的过滤器。
2、@EnableZuulProxy注解的过滤器包括pre类型的过滤器、route类型的过滤器。
@Component
public class TokenFilter extends ZuulFilter {
// 返回过滤器类型:pre/route/post
@Override
public String filterType() {
return PRE_TYPE;
}
// 返回过滤器执行顺序号,不需要是连续的
@Override
public int filterOrder() {
return PRE_DECORATION_FILTER_ORDER -1;
}
// 如果返回true,那么run()将被执行,如果返回false,则不执行run()方法
@Override
public boolean shouldFilter() {
return true;
}
/**
* 若shouldFilter()返回true,那么该方法将被执行
* @return
*/
@Override
public Object run() {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String token = request.getParameter("token");
if (StringUtils.isEmpty(token)){
currentContext.setSendZuulResponse(false);
currentContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
}
return null;
}
}
统一配置中心——Config
-
配置文件加载流程图
1、当客户端启动时,根据bootstrap.properties中配置的应用名称(spring.application.name)和环境名称(spring.profiles.active)向配置服务请求获取配置信息。
2、配置服务器根据客户端的请求参数,从git中查找匹配的文件。
3、配置服务器将匹配的Git仓库拉取到本地,并建立本地缓存。
4、配置服务器根据拉取的配置文件创建Spring的ApplicationContext实例,然后返回给客户端。
5、客户端接收到信息之后,将数据加载到自己的上下文中
-
配置中心实现配置自动刷新
使用客户端负载均衡——Ribbon
通过ribbon所提供的@LoadBalanced注解开启客户端负载均衡。
-
ribbon客户端负载均衡原理
1、服务发现:能够自动发现所依赖服务的列表
2、服务监听:能够监听失效的服务,并高效地将失败服务从服务列表中删除
3、服务选择策略:决定如何从多个服务实例中选择一个有效的服务实例,并进行相应的服务请求处理。
-
ribbon负载均衡策略
1、RoundRobinRule:轮询策略
每次调度执行i = (count + 1) mod n,并选出第i台服务实例
2、RandomRule:随机选择
从可用的服务实例列表中选择一个进行访问
3、BestAvailableRule:最大可用策略
先过滤出故障服务实例后,选择一个当前并发请求数最小的。
4、WeightedResponseTimeRule:带有加权的轮询策略
对各个服务实例响应时间进行加权处理,然后在采用轮询的方式获取响应的服务实例
5、AvailabilityFilterRule:可用过滤策略
先过滤出有故障或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个实例
6、ZoneAvoidanceRule:区域感知策略
先选择最优区域,再使用次过滤条件进行过滤,最后对满足条件的服务实例使用轮询方式选择一个
未完待续.......