第一个Feign程序
1. Feign被集成到SpringCloud Netflix模块,当Eureka,Ribbon集成的时候呢,Feign就具备了负载均衡的功能。Feign本身使用就很简便,再加上与SpringCloud的整合,将很大程度上降低我们开发的工作量。
2. 它是Github上面的一个开源项目,目的是为了简化WebService客户端的开发,在使用Feign的时候 可以使用注解来修饰接口,被修饰的接口就具有了访问webservice的能力,这些注解呢 可以使用Feign的自带注解,也可以支持使用第三方的注解。Feign还支持插件式的编码器和解码器,使用者可以通过这些特性,对请求和响应进行封装和解析。
Feign会更加的面向对象,下面我们使用Feign来对比一下CXF。在这之前我们需要准备对外提供接口。
如果没有接口等项目的朋友,可以参照前几章的“SpringCloud 中使用 Ribbon(默认轮询规则 + 自定义规则)”搭建(只搭建服务器与服务提供者即可)
这里我们一次把依赖CXF、Feign的依赖全部引入:pom.xml
- <dependencies>
- <!-- CXF -->
- <dependency>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-core</artifactId>
- <version>3.1.0</version>
- </dependency>
- <dependency>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-rt-rs-client</artifactId>
- <version>3.1.0</version>
- </dependency>
-
- <!-- Feign -->
- <dependency>
- <groupId>io.github.openfeign</groupId>
- <artifactId>feign-core</artifactId>
- <version>9.5.0</version>
- </dependency>
- <dependency>
- <groupId>io.github.openfeign</groupId>
- <artifactId>feign-gson</artifactId>
- <version>9.5.0</version>
- </dependency>
- </dependencies>
下面我们编写一个CXF客户端,进行测试:CxfClient.java
- public class CxfClient {
-
- public static void main(String[] args) throws IOException {
- // 创建 WebClient
- WebClient client = WebClient.create("http://localhost:9090/getPoliceById/123");
- // 获取响应
- Response response = client.get();
- // 获取响应内容
- InputStream is = (InputStream) response.getEntity();
- String content = IOUtils.readStringFromStream(is);
- // 打印结果
- System.out.println("请求结果:" + content);
- }
- }

乱码的问题不用管,我们就看 WebClient.create 方法中的url,url多的话,维护起来也麻烦。。。接下来,我们编写一个Feign程序,与CXF进行一下对比
在文章的一开始,提到了 Feign 程序会更加的面向对象,所以我们先创建一个实体类,用来接收结果对象:Police.java
- public class Police {
-
- private String id;// 警察编号,用来保存用户输入的参数
- private String url;// 处理请求的服务器url
- private String message;// 提示信息
-
-
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public String getMessage() {
- return message;
- }
- public void setMessage(String message) {
- this.message = message;
- }
-
- }
其次,我们创建一个接口类:FeignService.java
- public interface FeignService {
-
- @RequestLine("GET /getPolice")
- public String getPolice();
-
- @RequestLine("GET /getPolice")
- public Police getPoliceObj();
-
- @RequestLine("GET /getPoliceById/{id}")
- public String getPoliceById(@Param("id") String id);
- }
最后,我们再创建一个测试类,查看结果:TestMain.java
- public class TestMain {
- public static void main(String[] args) {
- // 返回字符串
- FeignService client = Feign.builder().target(FeignService.class, "http://localhost:9090");
- String policeStr = client.getPolice();
- System.out.println("===== 直接返回:"+policeStr);
- String policeByIdStr = client.getPoliceById("123");
- System.out.println("===== 根据id返回:"+policeByIdStr);
-
- // 返回对象
- FeignService client2 = Feign.builder().
- decoder(new GsonDecoder()).// 解码器
- target(FeignService.class, "http://localhost:9090");
- Police police = client2.getPoliceObj();
- System.out.println("===== 请求结果返回对象:");
- System.out.println("id:"+police.getId());
- System.out.println("url:"+police.getUrl());
- System.out.println("message:"+police.getMessage());
- }
- }
