网站挂黑链赚钱,国外免费网站服务器,wordpress开发ide,说说网站是怎样建设和推广的一.由来 1.在传统的架构里面#xff0c;我们是通过使用RestTemplate来访问其他的服务#xff0c;但是这种方式就存在了一个很大的缺陷#xff0c;也就是被调用方如果发生了服务的迁移(IP和端口发生了变化)#xff0c;那么调用方也需要同步的在代码里面进行修改#xff0c;… 一.由来 1.在传统的架构里面我们是通过使用RestTemplate来访问其他的服务但是这种方式就存在了一个很大的缺陷也就是被调用方如果发生了服务的迁移(IP和端口发生了变化)那么调用方也需要同步的在代码里面进行修改然后重启服务
2.这种方法在微服务新起以后它的弊端就被无线放大因此这个方式就逐渐的演变然后形成了注册中心和配置中心虽然我们使用注册中心解决服务发送迁移等等其他的一系列问题但是最根本的服务之间的Http访问问题还是没有解决
3.在两个服务之间需要发生调用它首先需要来到注册中心在注册中心拿到相应的服务以后再在本地进行负载负载之后再发起远程调用但是在微服务里面服务的调用是非常的频繁比如在一个方法里面可能出现多个服务的调用那么同一个服务之间的调用就出现了代码的冗余。(我们以为最简单的为例比如我们通过一个代码来都注册中心里面拉取这个注册配置然后再本地进行负载负载之后再通过RestTemplate进行访问也就是说一次简单的调用就需要写三行代码如果是多个服务就要编写更多的代码这样就出现了代码的冗余)
因此基于这种场景就引入了Fegin。 二.基本概念 1.Fegin是一个声明式的Web服务客户端它简化了使用基于HTTP的远程服务开发(相当于把我们上面说的三行代码进行了一个封装当我们使用远程调用的时候直接使用Fegin然后Fegin的底层来帮我们实现这个调用的过程)
2.Fegin是在RestTemplate和Ribbon的基础上进一步封装使用RestTemplate实现Http调用使用Ribbon实现负载均衡关系如图所示 Feign的主要特点和功能包括
1.声明式APIFeign允许开发者使用简单的注解来定义和描述对远程服务的访问通过使用注解开发者可以轻松地指定URL、HTTP方法、请求参数、请求头等信息使得远程调用变得非常直观和易于理解。 FeignClient(name example, url https://api.example.com)public interface ExampleService {GetMapping(/endpoint)String getEndpointData();}
2.集成负载均衡Feign集成了Ribbon负载均衡器可以自动实现客户端的负载均衡它可以根据服务名和可用实例进行动态路由并分发请求到不同的服务实例上提高系统的可用性和可伸缩性(我们不需要来处理负载均衡了由Fegin来帮我们集成了)
3.容错机制Feign支持集成Hystrix容错框架可以在调用远程服务时提供容错和断路器功能(防止雪崩)当远程服务不可用或响应时间过长时Feign可以快速失败并返回预设的响应结果避免对整个系统造成级联故障。
3.自定义错误处理允许你配置自定义的错误处理策略当远程服务返回错误时能够进行定制化的处理
FeignClient(name user-service, configuration CustomFeignConfiguration.class)
public interface UserClient {// 方法定义
}Configuration
public class CustomFeignConfiguration {Beanpublic ErrorDecoder errorDecoder() {return new MyCustomErrorDecoder(); // 自定义错误解码器}
}注意
在2019年Netflix宣布停止对Feign的维护为了替代 Feign Spring Cloud 社区推出了 OpenFeign它继承了Feign的所有功能并增加了对Spring MVC注解的支持OpenFeign目前仍在维护中特别是在Spring Cloud Finchley及以上版本中广泛使用。
其实OpenFeign 和 Feign 在使用方式上非常相似因为 OpenFeign 是 Feign 的社区版并且在设计上保持了与 Feign 一致的 API 和功能换句话说OpenFeign 基本上是对 Feign 的延续和改进尤其是在与 Spring Cloud 集成方面所以二者的使用方式差异并不大。 三.为什么Fegin第一次调用耗时很长 主要原因是由于Ribbon的懒加载机制当第一次调用发生时Fegin会触发Ribbon的加载过程包括从服务注册中心获取服务列表、建立连接池等操作这个加载过程会增加首次调用的耗时。
解决方案 ribbon:eager-load:enabled: true // 开启饥饿加载clients: service-1 // 服务名多个以逗号隔开
可以在应用启动时预热Fegin客户端自动触发一次无关紧要的调用来提前加载Ribbon和其他相关组件这个就相当于提前进行了一次调用。 四.Fegin是怎么做负载均衡 在Feign中负载均衡是通过集成Ribbon来实现的。
Ribbon是Netfix开源的一个客户端负载均衡器可以与Feign无缝集成为Feign提供负载均衡的能力。
Ribbon在发起请求前会从“服务中心”获取服务列表(清单)然后按照一定的负载均衡策略去发起请求从而实现客户端的负载均衡。 Ribbon本身也维护着“服务提供者”清单的有效性相当于是缓存了服务清单只有当它发现“服务提供者”不可用才会重新从“服务中心”获取有效的“服务提供者”清单来及时更新并不是每一次调用都会进行拉取这种方式也提高了整个系统的性能。 五.Fegin怎么实现认证传递 首先先我们需要知道为什么Fegin需要实现认证传递先了解一下微服务的完调用链路 1.通常用户在前端进行请求请求就就会到达Nginx然后Nginx就会进行转发到达我们的Api网关层在Api网关层就会通过一个过滤器来实现一个认证服务然后校验通过的请求就会将相应的认证信息或者是用户信息存到请求头里面
2.网关完成认证之后就会将请求转发到一个具体的微服务微服务中使用HandlenInterceptor拦截器来获取Api层传递过来的认证信息使用过滤器和拦截器就打通了Api层和微服务层的一个认证信息的传递
3.但是其实大量的请求并不是直接通过网关层到达服务层而是直接由微服务之间的调用产生微服务都是通过了HandlenInterceptor拦截器来获取请求头里面的信息而微服务之间的调用是通过了openFegin来进行处理的而使用openFegin时并没有在请求头中添加相应的一个请求信息所以被调用的微服务就没有办法直接使用拦截器获取到一个相应的认证信息所以为了解决这个问题就需要在openfegin调用的时候将相应的用户信息或认证信息存储到请求头里面这样才能完成微服务之间的一个认证问题。
解决方案
比较常见的一种做法就是使用拦截器传递认证信息可以通过实现RequestInterceptor接口来定义拦截器在拦截器里把认证信息添加到请求头中然后将其注册到Fegin的配置中。
Configuration
public class FeignclientConfig {Beanpublic RequestInterceptor requestInterceptor() {return new RequestInterceptor() {Overridepublic void apply(RequestTemplate template) {// 添加认证信息到请求头中template.header(Authorization, Bearer getToken());}};}private String getToken() {return token;}
}