当前位置: 首页 > 科技观察

SpringCloudOpenFeign+Nacos的正确打开方式!

时间:2023-03-12 07:48:22 科技观察

作者|磊哥来源|Java中文社区(ID:javacn666)转载请联系授权(微信ID:GG_Stone)Nacos支持两种HTTP服务请求,一种是RESTTemplate,一种是FeignClient。上一篇我们介绍了RestTemplate的调用方式,主要是通过Ribbon(负载均衡)+RestTemplate实现HTTP服务调用。请求的核心代码如下:@RestControllerpublicclassConsumerController{@ResourceprivateRestTemplaterestTemplate;@GetMapping("/consumer")publicStringconsumer(@RequestParamStringname){//请求并获取结果(springcloud-nacos-provider是nacos中的服务id)Stringresult=restTemplate.getForObject("http://springcloud-nacos-provider/call/"+name,String.class);返回结果;}}从上面的实现代码中,我们可以看出一个问题。以上代码虽然可以实现HTTP服务调用,但是需要开发者手动拼接调用地址和参数。而且远程服务调用和客户端自己的业务逻辑实现混合在一起,不利于后期的维护和扩展,那么如何解决这个问题呢?这就是我们今天要介绍的OpenFeign的由来。OpenFeign简介OpenFeign的全称是SpringCloudOpenFeign,是Spring官方推出的声明式服务调用和负载均衡组件。它似乎取代了已进入维护状态的Feign(NetflixFeign)。也就是说OpenFeign(SpringCloudOpenFeign)是Feign的升级版,他们的关系如下图所示:由于Feign已经停止维护,Spring官方需要推出新的框架来升级扩展Feign功能.OpenFeign常用注解OpenFeign声明式服务调用和负载均衡组件,所以其核心是使用注解+接口实现服务调用,所以理解OpenFeign的注解非常重要。对于Feign框架,它只支持Feign注解和JAX-RS注解,但是OpenFeign也在Feign的基础上增加了对SpringMVC注解的支持,比如@RequestMapping、@GetMapping、@PostMapping注解。OpenFeign常用的注解如下:@EnableFeignClients:该注解用于开启OpenFeign功能。当SpringCloud应用启动时,OpenFeign会扫描标记。@FeignClient注解接口生成一个代理,注册到Spring容器中。@FeignClient:该注解用于通知OpenFeign组件解析@RequestMapping注解下的接口,通过动态代理生成实现类,实现负载均衡和服务调用。@RequestMapping:向服务提供者发起Request请求(默认为GET请求)。这里需要注意的是,@RequestMapping/@GetMapping/@PostMapping与SpringMVC中的同名注解含义完全不同。@GetMapping:向服务提供者发起GET请求。@PostMapping:向服务提供者发起POST请求。OpenFeign使用OpenFeign用于服务消费者端。有消费者端,就必然有服务提供者端。他们的关系如下图所示:所以我们首先需要创建一个服务提供者Provider,创建步骤如下。创建服务提供者第一步:首先创建一个SpringBoot项目(SpringCloud项目是基于SpringBoot创建的),添加spring-web和nacos-discovery依赖。具体的依赖信息如下:>com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery第二步:设置Nacos相关配置,添加如下内容application.yml中的配置:spring:application:name:springcloud-nacos-provider#项目名(nacos注册的服务名)cloud:nacos:discovery:username:nacos#nacos登录用户名密码:nacos666#nacos密码server-addr:127.0.0.1:8848#nacos服务器地址server:port:8081#项目启动端口号第三步:添加服务方法,如下代码所示:importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;导入org.springframework.web.bind.annotation.PathV可变的;导入org.springframework.web.bind.annotation.RequestMapping;导入org.springframework.web.bind.annotation.RestController;@SpringBootApplication@RestController公共类HttpProviderApplication{publicstaticvoidmain(String[]args){SpringApplication.run(HttpProviderApplication.class,参数);}/***为客户端提供可调用接口*/@RequestMapping("/call/{name}")publicStringcall(@PathVariableStringname){returnLocalTime.now()+"——服务提供者1:"+姓名;}}创建服务消费者第一步:创建一个SpringBoot项目,添加spring-web、nacos-discovery和openfeign依赖,具体依赖如下:org.springframework.bootspring-boot-starter-webcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoveryorg.springframework.cloudspring-cloud-starter-openfeign第二步:设置Nacos相关配置,在application中添加在.yml中配置如下:spring:application:name:springcloud-nacos-consumer#项目名(nacos注册的服务名)cloud:nacos:discovery:username:nacos#nacos登录用户名password:nacos666#nacos密码server-addr:127.0.0.1:8848#nacos服务器地址server:port:8093#项目启动端口号第三步:在SpringBoot项目的启动文件中添加@EnableFeignClients注解,开启OpenFeign。具体实现代码如下:importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication@EnableFeignClients//启用OpenFeignpublicclassOpenfeignConsumerApplication{publicstaticvoidmains(String){SpringApplication.运行(OpenfeignConsumerApplication.class,一个rgs);}}第四步:最重要的一步是创建OpenFeign和服务提供者之间的调用接口。实现代码如下:importorg.springframework.cloud.openfeign.FeignClient;importorg.springframework.web.bind.annotation。GetMapping;importorg.springframework.web.bind.annotation.PathVariable;@FeignClient("springcloud-nacos-provider")//nacosserviceidpublicinterfaceSpringCloudNacosProviderClient{@GetMapping("/call/{name}")//使用get方法,调用服务提供者的/call/{name}接口publicStringcall(@PathVariable(value="name")Stringname);}第五步:编写服务调用者的代码,在上一步之后服务提供者封装后,我们可以像调用本地方法一样调用控制器中的远程接口。具体实现代码如下:web.bind.annotation.RestController;importjavax.annotation.Resource;@RestControllerpublicclassConsumerController{@ResourceprivateSpringCloudNacosProviderClientproviderClient;//加载openfeignclient@GetMapping("/consumer")publicStringconsumer(@RequestParamStringname){//和调用本地方法一样,调用openfeignclient中的方法returnproviderClient.call(name);}}然后分别启动serviceprovider和servicecaller程序,执行结果如下图所示:注意事项OpenFeign默认的接口超时时间是1s,所以如果接口的执行时间超过1s,程序调用会报错接下来我们写个程序测试一下,让服务提供者的代码休眠2s。具体实现代码如下:importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.web。bind.annotation.PathVariable;导入org.springframework.web.bind.annotation.RequestMapping;导入org.springframework.web.bind.annotation.RestController;导入java.time.LocalTime;导入java.util.concurrent.TimeUnit;@SpringBootApplication@RestControllerpublicclassHttpProviderApplication{publicstaticvoidmain(String[]args){SpringApplication.run(HttpProviderApplication.class,args);}/***为客户端提供可调用接口*/@RequestMapping("/call/{name}")publicStringcall(@PathVariableStringname)throwsInterruptedException{//让程序休眠2sTimeUnit.SECONDS.sleep(2);returnLocalTime.now()+"——服务提供商1:"+name;}}使用OpenFeign客户端访问服务后,会出现如下错误信息:解决方法:通过修改配置文件中的超时时间来解决这个问题,也就是手动调整接口的超时时间,因为1s确实是太短了,修改配置信息如下:ribbon:ReadTimeout:5000#请求连接超时时间ConnectionTimeout:10000#请求处理超时时间总结OpenFeign是基于Feign实现的,Feign是SpringCloud官方提供的注解调用REST接口框架,OpenFeign/Feign底层基于在Ribbon上实现负载均衡使用OpenFeign有三个关键步骤。首先在SpringBoot启动类上使用注解@EnableFeignClients开启OpenFeign;第二,使用@FeignClient+@GetMapping/@PostMapping调用服务提供者的接口;第三,在客户端对象中注入FeignClient,像调用本地方法一样调用远程接口。