Spring Cloud Alibaba 教程 | Feign 篇
写在前面的话: 本笔记在参考网上视频以及博客的基础上,只作为个人学习笔记,如有侵权联系删除,谢谢!
1、Feign替代RestTemplate
1.1 引入依赖
<!-- Feign 客户端依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
**1.2 添加注解**
启动类添加注解**@EnableFeignClients**开启Feign的功能
@SpringBootApplication
@EnableFeignClients
public class NacosConsumerApplication {public static void main(String[] args) {SpringApplication.run(NacosConsumerApplication.class,args);}
}
1.3 编写客户端,使用@FeignClient(value = “服务提供方服务名”)
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient(value = "nacos-provider") //对应的服务提供方的spring.application.name配置
public interface ServiceFeginClient {@GetMapping("/nacos-provider/sayHello/getConfig") // 服务提供方的restful请求路径String getConfig();@GetMapping("/nacos-provider/sayHello/test/{name}")// nacos-provider为服务提供方的context-path,无则不写String sayHello(@PathVariable("name") String name);}
这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:
- 服务名称:nacos-provider
- 请求方式:GET
- 请求路径:/nacos-provider/sayHello/test/{name}
- 请求参数: String name
- 返回值类型:String
这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。
1.4 使用Feign客户端
import com.cwh.fegin.ServiceFeginClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("hello")
public class ConsumerController {@Autowiredprivate ServiceFeginClient serviceFeginClient; //编写的客户端@RequestMapping("sayHi/{name}")public String sayHello(@PathVariable("name") String name){return serviceFeginClient.sayHello(name);}@RequestMapping("getConfig")public String getConfig(){return serviceFeginClient.getConfig();}}
1.5 总结
1、引入依赖
2、启动类上加注解@EnableFeignClients
3、使用@FeignClient编写客户端
4、使用FeignClient中定义的方法代替RestTemplate
2、Feign使用优化
Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:
•URLConnection:默认实现,不支持连接池
•Apache HttpClient :支持连接池
•OKHttp:支持连接池
因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection。
这里我们用Apache的HttpClient来演示。
1)引入依赖
在Feign客户端的pom文件中引入Apache的HttpClient依赖:
<!--httpClient的依赖 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
</dependency>
2)配置连接池
在Feign客户端工程的application.yml中添加配置:
feign:client:config:default: # default全局的配置loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息httpclient:enabled: true # 开启feign对HttpClient的支持max-connections: 200 # 最大的连接数max-connections-per-route: 50 # 每个路径的最大连接数
3)抽取方法
利用Maven
分模块开发抽取FeignClient
模块
添加依赖:
<!-- Feign 客户端依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在使用该客户端的启动类@EnableFeignClients
注解上添加扫描包路径
@EnableFeignClients(basePackages = "com.cwh.feign")
同时引入feign-api公共包
<dependency><groupId>com.cwh</groupId><artifactId>feign-api</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>
同时引入feign-api公共包
<dependency><groupId>com.cwh</groupId><artifactId>feign-api</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>
在使用该客户端的地方注入即可。