OpenFeign的使用
项目整体架构
整合EurekaClient完成基础注册的过程这里就不再重复,想了解的查看我前两遍文章就好。
整合OpenFeign
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类配置
@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient //声明是Eureka中注册的客户端,默认可不写
public class PayApplication {
public static void main(String[] args) {
SpringApplication.run(PayApplication.class, args);
}
}
编写接口使用@FeignClient(“调用服务名”)
@FeignClient(value = "user-server") // 需要访问的服务的注册服务名
public interface UserFeignClient {
。。。。。
}
编写接口方法
@GetMapping("/user/{id}") // 直接从UserController中复制的,需要完全一致
User getById(@PathVariable("id")Long id);
编写Controller接口,注入接口即可
@RestController
public class PayController {
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/pay/{id}")
public User getUserById(@PathVariable("id") Long id) {
return userFeignClient.getById(id);
}
}
理解Feign的工作原理(重要)
要使用Feign,我们除了导入依赖之外,需要主配置类通过@EnableFeignClients(value=“”)注解开启Feign,也可以通过value属性指定了Feign的扫描包。同时我们需要为Feign编写客户端接口,接口上需要注解@FeignClient标签。 当程序启动,注解了@FeignClient的接口将会被扫描到然后交给Spring管理。
当请求发起,会使用jdk的动态代理方式代理接口,生成相应的RequestTemplate,Feign会为每个方法生成一个RequestTemplate同时封装好http信息,如:url,请求参数等等
最终RequestTemplate生成request请求,交给Http客户端(UrlConnection ,HttpClient,OkHttp)。然后Http客户端会交给LoadBalancerClient,使用Ribbon的负载均衡发起调用。
Hystrix熔断器
首先简单介绍一下雪崩效应
某一个服务发生故障会导致调用它的服务跟着异常,然后导致整个调用链调用的异常,甚至导致整个微服务瘫痪 , — 这就是雪崩效应
Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题,如雪崩
Hystrix其设计原则如下:
- 防止单个服务异常导致整个微服务故障 - 为了解决雪崩
- 快速失败,如果服务出现故障,服务的请求快速失败,线程不会等待。
- 服务降级,请求故障可以返回设定好的二手方案数据(兜底数据)。
- 熔断机制,防止故障的扩散,导致整个服务瘫痪。
- 服务监控,提供了Hystrix Bashboard仪表盘,实时监控熔断器状态
Hystrix的功能
资源隔离(流控,限流)
资源隔离包括线程池隔离和信号量隔离,作用是限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用 ,这里可以简单的理解为资源隔离就是限制请求的数量。
线程池和信号量对比:
服务熔断
熔断机制是对服务链路的保护机制,如果链路上的某个服务不可访问,调用超时,发生异常等,服务会触发降级返回托底数据,然后熔断服务的调用(失败率达到某个阀值服务标记为短路状态),当检查到该节点能正常使用时服务会快速恢复。
简单理解就是当服务不可访问了或者服务器报错了或者服务调用超过一定时间没返回结果,就立马触发熔断机制配合降级返回预先准备的兜底数据返回,不至于长时间的等待服务的相应造成大量的请求阻塞,也不至于返回一些错误信息给客户端,而是返回一些兜底数据。
降级机制
超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
简单理解就是服务降级就是当服务因为网络故障,服务器故障,读取超时等原因造成服务不可达的情况下返回一些预先准备好的数据给客户端。
在生活中服务降级到处可见,如在系统故障我们会返回友好的提示“服务暂时不可用”,或者如淘宝双11期间退款服务,留言服务暂时不可用,这个就是为了保证正常的购物流程相关服务没问题,然后人为的关闭一些不重要的服务,配合降级返回一些托底数据返回给用户(比如返回友好的提示信息“暂时不能退款”)。
缓存
提供了请求缓存、请求合并实现 , 在高并发的场景之下,Hystrix请求缓存可以方便地开启和使用请求缓存来优化系统,达到减轻高并发时请求线程的消耗、降低请求响应时间的效果。
Hystrix工作机制
OpenFeign使用Hystrix[掌握]
yaml开启Hystrix
通过feign.hystrix.enabled=true
开启Hystrix
feign:
hystrix:
enabled: true #开启熔断支持
Fiegn接口熔断-fallback方式
@FeignClient(value = "user-server", fallbackFactory = UserFeignClientFallbackFactory.class) // 需要访问的服务的注册服务名
public interface UserFeignClient {
@GetMapping("/user/{id}") // 直接从UserController中复制的,需要完全一致
User getById(@PathVariable("id")Long id);
}
编写降级类
@Component //将UserFeignClientFallbackFactory交给spring管理
public class UserFeignClientFallbackFactory implements FallbackFactory<UserFeignClient> {
@Override
public UserFeignClient create(Throwable throwable) {
return new UserFeignClient() { // 匿名内部类语法
@Override
public User getById(Long id) {
throwable.printStackTrace();
return new User(-1L,"","系统异常,请稍后重试");
}
};
}
}
服务网关-spring cloud zuul
整合Zuul
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
启动类
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
配置文件配置zuul
server:
port: 10050
eureka:
client:
serviceUrl:
defaultZone: http://localhost:10010/eureka/
instance:
instance-id: zuul-server
spring:
application:
name: zuul-server
zuul:
ignored-services: "*" #配置拦截禁用掉使用浏览器通过服务名的方式访问服务
prefix: "/services" #配置路由中的路径前缀 感觉没什么用
routes: #配置路由 根据路径中/order/**找对应的order-service服务
user-server: "/user/**"
order-server: "/order/**"
pay-server: "/pay/**"