fegin的使用
一:故事背景
服务在生产环境做了负载,部署了两台。用了同一个nacos的命名空间。
上线的时候只对其中的一台做了更新,导致请求到另一台的时候产生了404的问题
二: fegin调用准备
2.1 概念
Feign是一个声明式的HTTP客户端。这意味着开发者可以通过定义接口的方式,来简化使用HTTP API的过程,而不需要手动构建HTTP请求和解析响应。
在定义Feign接口时,开发者需要指定要调用的HTTP端点的细节,包括请求参数、请求方法、请求头等。这些信息被定义在接口方法上的注解中,例如@RequestLine、@Param、@Headers等。
Feign会根据接口定义自动生成具体的HTTP请求,并将HTTP响应转换成Java对象。这样可以大大减少开发者的工作量,并提高代码的可读性和可维护性。
在微服务架构中,服务之间需要相互调用,而Feign可以作为一个轻量级的HTTP客户端,方便地实现微服务之间的调用。开发者只需要在Feign接口中定义服务之间的调用,Feign就可以自动处理HTTP请求和响应的过程。
Feign支持多种HTTP客户端实现,包括Apache HttpClient、OkHttp、JDK HttpURLConnection等。开发者可以根据需要选择不同的HTTP客户端实现。
Feign还支持断路器模式和负载均衡功能,这些功能可以使微服务之间的调用更加可靠和高效。例如,在使用Ribbon作为负载均衡器的情况下,Feign会自动集成Ribbon,从而实现服务调用的负载均衡。
总之,Feign是一个非常便捷的HTTP客户端框架,可以大大简化服务之间的调用过程,并提高代码的可读性和可维护性。在微服务架构中,Feign的应用非常广泛,是一个不可或缺的工具。
2.2 准备使用Nacos的SpringCloud项目
首先准备一个使用了nacos的springCloud项目。并且为这个项目创建两个模块。
这里我们将服务一作为调用方,服务二作为被调用方。(往往我们的项目中,一个服务可能即是调用方,又是被调用方。)
2.3 被调用方操作步骤
被调用方不需要额外增加任何操作,只要有对应的接口就可以了。下图为我的服务二controller提供对外的接口
2.4 调用方操作步骤
2.4.1 引入openFegin的依赖
<!-- fengin调用--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2.4.2 创建fegin调用的接口2.4.3 启动类上添加@EnableFeignClients注解
@EnableFeignClients注解是Spring Cloud Feign框架提供的一个注解,用于开启Feign客户端功能。
2.4.4需要的地方进行注入,然后进行使用
2.4.5 测试
根据结果我们可以看出。调用的serverOne的服务,serverone里通过fegin调用了serverTwo的接口。
三:部署多个服务
故事背景里提到。同样的服务部署了两份,更新的时候只更新了其中的一份。我们在本地进行一下模拟
3.1 服务部署
我们把上文提到的serviceTwo服务部署两份,由于是在我自己本机上操作,我们使用端口号进行一下区分。
这样我们就模拟出了,serverTwo服务,部署了两份。我们可以看一下nacos,现在serverTwo项目有两个实例。这两个服务的默认权重都是1,也就是如果我再次使用 serverOne对serverTwo进行fegin调用,会走一次9002端口,然后会走一次9004端口。
3.2 服务修改
我们将9004端口对应的服务内容进行一下更改,将serviceTwo/test 接口注释。模拟一下,两个服务不同,即是上文提到的一个服务更新了,另一个服务没有更新,调用到未更新的就会产生404问题
3.3 重启后测试
第二次调用的时候,由于9004对应的serverTwo服务的接口被注销调了,无法调通。这样就复现了上文所出现的问题
一个服务更新了,另一个服务没有更新,调用到未更新的就会产生404问题
四:如何解决
那么我们如何才能避免这种问题呢?我暂时想到的是
将一个服务都配置到一个jenkins里,一次构建,多个服务同时都更新。
通过上线流程约束
五:总结&升华
通过本文,我们复现了之前出过的事故。只要是人去做事,就一定会出错,所以我们要学会让机器去做事,而不是靠人。并且做事的时候一定要求全局观,不能丢掉任何一部分