在使用springcloud作为技术栈的时候,在rpc通信方面,有很多框架选择,例如dubbo,openfeign等。
OpenFeign是一个声明式的web服务客户端,它使得编写Web服务客户端变得非常容易。它使用基于注解的方式来定义和实现Web服务客户端。OpenFeign将Web服务API的定义与客户端的实现分离开来,从而使得Web服务API的维护变得更加简单。OpenFeign内置了对负载均衡、服务发现和断路器等功能的支持,使得在微服务架构中使用OpenFeign更加便捷。
springboot整合openfeign
maven
<properties><java.version>21</java.version><spring-cloud.version>2022.0.0</spring-cloud.version><spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
</properties>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency>
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
配置类
@Configuration
public class FeignConfig {@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}
rpc类
@FeignClient(url = "https://api.weixin.qq.com", name = "wx")
public interface WxService {@GetMapping("/sns/jscode2session")String jscode2session(@RequestParam String appid, @RequestParam String secret, @RequestParam String js_code, @RequestParam String grant_type);@PostMapping("/wxa/business/getuserphonenumber")WxResponse getuserphonenumber(@RequestBody WxRequest wxRequest, @RequestParam String access_token);@GetMapping("/cgi-bin/token")TokenResponse token(@RequestParam String grant_type, @RequestParam String appid, @RequestParam String secret);
}
dto类
public record TokenResponse(String access_token, Integer expires_in) {
}
public record WxResponse(String openid,String session_key,String unionid,int errcode,String errmsg
) {}
启动类
@SpringBootApplication
@EnableFeignClients
public class PlatformApplication {public static void main(String[] args) {SpringApplication.run(PlatformApplication.class, args);}}
测试类
@Test
void testCode() {TokenResponse token = wxService.token("client_credential", "wxxxxxxxxx", "xxxxxxxxxx");System.out.println(token);var wxResponse = wxService.getuserphonenumber(new WxRequest("xxxxxxxxxxxxxxxxxxxxxxx"), token.access_token());System.out.println(wxResponse);
}
网络环境不好造成的超时问题
解决方案,一般遇到openfeign调用时超时有两种情况,一种是调用三方服务,一种是自己的服务,解决方案和思路也有差距
三方服务
三方服务的特点是自己只作为调用方无法控制被调用的代码,而且也无法确定对方的网络以及代码执行情况
可以通过添加超时时间
在配置文件中添加
feign:client:config:default:connectTimeout: 1500readTimeout: 1500
自己服务
超时的原因可能时因为服务不稳定,可以采取重试策略
由于openfeign是默认不支持重试的,需要添加添加配置类,具体的时间需要根据实际情况填写,毕竟内网请求太久多半是服务架构不合理
@Configuration
public class FeignConfigure {@Beanpublic Retryer feignRetryer(){Retryer retryer = new Retryer.Default(100, 1000, 2);return retryer;}
}
优化下又服务
找到超时的原因,可能是数据库查询没走索引,可能是大文件读写等问题,需要优化代码逻辑