SpringCloud
分析说明:
Eureka是服务注册中心,只做服务注册;自身并不提供服务也不消费服务。可以搭建web工程使用Eureka,可以使用Spring Boot方式搭建
启动器依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
application.yml配置文件:
server: port: 10086 spring: application: name: eureka-server eureka: client: service-url: # eureka 服务地址,如果是集群的话;需要指定其它集群eureka地址 defaultZone: http://127.0.0.1:10086/eureka # 不注册自己 register-with-eureka: false # 不拉取服务 fetch-registry: false
启动引导类注解:
EurekaClient 将自己注册到EurekServer,并从EurekaServer获取服务列表进行远程调用
注册服务(服务的提供者)
发现服务(服务的调用者)
通过注解注明Eureka客户端发现功能
其主要配置不同端口;
负载均衡是一个算法,可以通过该算法实现从地址列表中获取一个地址进行服务调用
Ribbon提供了轮询、随机两种负载均衡算法(默认是轮询)可以实现从地址列表中使用负载均衡算法获取地址进行服务调用
Ribbon的负载均衡通过RestTemplate远程调用实现:
在实例化RestTemplate的时候使用@LoadBalanced,服务地址直接可以使用服务名。
3,客户端负载均衡——Feign:
Feign主要作用:自动根据参数拼接http请求地址。
Feign基于以上的客户端负载均衡Ribbon进行优化封装,即:Ribbon+RestTemplate
实现步骤:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
编写Feign客户端 @FeignClient开启Feign功能
//声明当前类是一个Feign客户端,指定服务名为user-service @FeignClient("user-service") public interface UserClient { //http://user-service/user/123 @GetMapping("/user/{id}") User queryById(@PathVariable Long id); }
3,编写一个处理器ConsumerFeignController,注入Feign客户端并使用
@RestController @RequestMapping("/cf") public class ComsumerFeignController { //通过Feign实现远程调用 @Autowired private UserClient userClient; @GetMapping("/{id}") public User findById(@PathVariable Long id) { return userClient.findById(id); } }
4,熔断器——Netflix Hystrix:
熔断器的作用:某个服务的单个点的请求故障会导致用户的请求处于阻塞状态,最终的结果就是整个服务的线程资源消耗殆尽。
由于服务的依赖性,会导致依赖于该故障服务的其他服务也处于线程阻塞状态,最终导致这些服务的线程资源消耗殆尽 直到不可用,
从而导致整个问服务系统都不可用,即产生雪崩效应
Hystrix解决雪崩效应:
-
线程隔离:用户请求不直接访问服务,而是使用线程池中空闲的线程访问服务,加速失败判断时间。
-
服务降级:及时返回服务调用失败的结果,让线程不因为等待服务而阻塞。
熔断器原理:
通过配置服务熔断参数修改默认:
hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 2000 circuitBreaker: errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50% sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒 requestVolumeThreshold: 10 # 熔断触发最小请求次数,默认值是20
引入坐标
pom.xml spring-cloud-starter-netflix-hystrix
引导类上加
@SpringCloudApplication @EnableFeignClients //开启Feign功能 public class ComsumerApplication { public static void main(String[] args) { SpringApplication.run(ComsumerApplication.class, args); }
服务调用者的Controller类中提供一个降级服务的方法 方案一:写在方法上 @HystrixCommand(fallbackMethod="methodName") 方案二:降级服务的方法抽取出去,让所有的方法使用 写在Controller类上@DefaultProperties(defaultFallback = "methodName") Controller的方法上, @HystrixCommand 降级服务的方法要和原方法的参数和返回值要一致。
closed : 调用的是原有的服务(method) open 调用的是降级服务(method) half open 尝试调用原有的服务,如果能调通,将熔断的状态改为closed,如果调不通,还是保持open状态
5.服务网关——Netflix Gateway(Zuul):
引入坐标
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
配置文件
server: port: 10010 spring: application: name: api-gateway cloud: gateway: routes: # 路由id,可以任意 - id: user-service-route # 代理的服务地址 uri: http://127.0.0.1:9091 # 路由断言: 可以匹配映射路径 predicates: - Path=/user/** # Gateway网关地址 eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka instance: prefer-ip-address: true
面向服务路由:
提供服务的地址:http://127.0.0.1:9091/user/8
-
添加前缀:对请求地址添加前缀路径之后再作为代理的服务地址;
http://127.0.0.1:10010/8 --> http://127.0.0.1:9091/user/8 添加前缀路径/user
-
去除前缀:将请求地址中路径去除一些前缀路径之后再作为代理的服务地址;
http://127.0.0.1:10010/api/user/8 --> http://127.0.0.1:9091/user/8 去除前缀路径/api
总结:
客户端的请求地址与微服务的服务地址如果不一致的时候,可以通过配置路径过滤器实现路径前缀的添加和去除。
注:由于作者对Spring Cloud Config 与 Spring Cloud Bus掌握不深,暂不概述