springcloud使用OpenFeign
1.概念
OpenFeign是一个Web声明式的Http客户端调用工具,提供接口和注解形式调用。
SpringCloud第一代采用feign第二代采用openfeign
openfeign客户端作用:是一个Web声明式的Http客户端远程调用工具,底层是封装HttpClient技术。
Openfeign属于SPringleCloud自己研发,而feign是netflix代码写法几乎是没有任何变化。
需要用到jar
2.动手实现
需要两个工程
这里之前的工程来使用。不会新建的可以看这个整个工程文档 https://blog.csdn.net/xiaoyaozizai1/article/details/108770550
新建一个member工程
结构如下
pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.cloud.alibaba</groupId>
<artifactId>spring-cloud-alibaba-study</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>member</artifactId>
<version>0.0.1.RELEASE</version>
<packaging>jar</packaging>
<dependencies>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-openfeign-core</artifactId>-->
<!-- <version>2.1.0.RELEASE</version>-->
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>10.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
</project>
启动的类
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } 配置OkHttpConfig
@Configuration @ConditionalOnClass(Feign.class) @AutoConfigureBefore(FeignAutoConfiguration.class) public class OkHttpConfig { // 默认老外留给你彩蛋中文乱码,加上它就 OK,实测不加这个也不会乱码 @Bean public okhttp3.OkHttpClient okHttpClient() { return new okhttp3.OkHttpClient.Builder() //设置连接超时 .connectTimeout(10, TimeUnit.SECONDS) //设置读超时 .readTimeout(10, TimeUnit.SECONDS) //设置写超时 .writeTimeout(10, TimeUnit.SECONDS) //是否自动重连 .retryOnConnectionFailure(true) .connectionPool(new ConnectionPool(10, 5L, TimeUnit.MINUTES)) .build(); } }
在controller 新建个接口
@RestController public class MemberController { @Resource MemberService memberService; @RequestMapping("/getUserId") public String getUserId(@RequestParam(value = "userId") Long userId) { return memberService.getUserName(userId); } }
新建一个接口,指向控制器的方法。member是注册到Nacos的名称。
@Component @FeignClient(value = "member") public interface MemberListFeign { @RequestMapping("/getUserId") public String getUserId(@RequestParam(value = "userId") Long userId); }
使用order工程调用member工程
(1) order的pom.xml 加入member依赖
<dependency> <groupId>com.cloud.alibaba</groupId> <artifactId>member</artifactId> <version>0.0.1.RELEASE</version> </dependency>
(2)在order启动类加上两个注解
@EnableDiscoveryClient @EnableFeignClients(basePackages = "com.cloud.alibaba.member.feign")
(3)调用member的接口
@RestController public class OrderController { @Autowired MemberListFeign memberListFeign; @RequestMapping("/getUserId") public String getUserId() { String result = memberListFeign.getUserId(123L); return result ; } }
注意feign客户端调用的事项:
如果请求参数没有加上注解的话,默认采用post请求发送。
Openfeign默认是支持负载均衡,ribbon。
Nacos服务注册 服务名称是否 有下划线?
在微服务架构中服务的名称命名不能够有下划线。
注意问题:
@Component
@FeignClient(value = "member")
1.使用Feign时,这里要加上@Component。
2.@FeignClient(value = "member") 里面的member是本项目注册到注册中心名称。