请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 1178|回复: 1

疯狂Spring Cloud连载(10)REST客户端Feign介绍

[复制链接]
发表于 2017-11-19 17:00:40 | 显示全部楼层 |阅读模式
本帖最后由 杨恩雄 于 2017-11-28 14:49 编辑

 本文节选自《疯狂Spring Cloud微服务架构实战》

Spring Cloud教学视频http://www.crazyit.org/thread-11730-1-1.html

Spring Cloud电子书http://www.crazyit.org/thread-11737-1-1.html

要点

    REST客户端

Spring Cloud集群中,各个角色的通信基于REST服务,因此在调用服务时,就不可避免的需要使用REST服务的请求客户端。前面的章节中使用了Spring自带的RestTemplateRestTemplate使用的HttpClient发送请求。本章中,将介绍另一个REST客户端:Feign

REST客户端Feign介绍

在学习Feign前,先了解REST客户端,本小节将简单地讲述Apache CXFRestlet这两款Web Service框架使用这两个框架来编写REST客户端,最后再编写一个FeignHello World例子。通过此过程,让大家可以对Feign有一个初步的印象如已经掌握这两个REST框架,可直接到后面章节学习Feign

本章的各个客户端,将会访问8080端口的“/person/{personId}”和“/hello个服务中的一个,服务项目使用“spring-boot-starter-web进行搭建,本小节对应的服务项目目录为:codes\05\5.1\rest-server

使用CXF调用REST服务

CXF是目前一个较为流行的Web Service框架,是Apache下的一个开源项目。使用CXF可以发布和调用各种协议的服务,包括SOAP协议、XML/HTTP等,当前CXF已经对REST风格的Web Service提供支持,可以发布或调用REST风格Web Service。由于CXF可以与Spring进行整合使用并且配置简单,因此得到许多开发者的青睐,而笔者以往所在公司的大部分项目,均使用CXF来发布和调用Web Service,本章所使用的CXF版本为3.1.10Maven中加入以下依赖:

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-core</artifactId>

<version>3.1.10</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-rs-client</artifactId>

<version>3.1.10</version>

</dependency>

编写代码请求/person/{personId}服务,请见代码清单5-1

代码清单5-1codes\05\5.1\rest-client\src\main\java\org\crazyit\cloud\CxfClient.java

public class CxfClient {

 

public static void main(String[] args) throws Exception {

//创建WebClient

WebClient client = WebClient.create("http://localhost:8080/person/1");

//获取响应

Response response = client.get();

//获取响应内容

InputStream ent = (InputStream) response.getEntity();

String content = IOUtils.readStringFromStream(ent);

//输出字符串

System.out.println(content);

}

}

客户端中,使用了WebClient类发送请求,获取响应后读取输入流,获取服务返回的JSON字符串。运行代码清单5-1,可看到返回的信息。

使用Restlet调用REST服务

Restlet是一个轻量级的REST框架,使用它可以发布和调用REST风格的Web Service小节使用的版本为2.3.10Maven依赖如下:

<dependency>

<groupId>org.restlet.jee</groupId>

<artifactId>org.restlet</artifactId>

<version>2.3.10</version>

</dependency>

<dependency>

<groupId>org.restlet.jee</groupId>

<artifactId>org.restlet.ext.jackson</artifactId>

<version>2.3.10</version>

</dependency>

客户端实现请见代码清单5-2

代码清单5-2codes\05\5.1\rest-client\src\main\java\org\crazyit\cloud\RestletClient.java

public class RestletClient {

 

public static void main(String[] args) throws Exception {

ClientResource client = new ClientResource(

"http://localhost:8080/person/1");

//调用get方法,服务发布的是GET

Representation response = client.get(MediaType.APPLICATION_JSON);

//创建JacksonRepresentation实例,将响应转换为Map

JacksonRepresentation jr = new JacksonRepresentation(response,

HashMap.class);

//获取转换后的Map对象

Map result = (HashMap) jr.getObject();

//输出结果

System.out.println(result.get("id") + "-" + result.get("name") + "-"

+ result.get("age") + "-" + result.get("message"));

}

}

代码清单5-2使用RestletAPI较为简单,在此不过多赘述,但需要注意的是,在Maven中使用Restlet,要额外配置仓库地址,笔者成书时Apache官方仓库中,并没有Restlet的包。在项目的pom.xml文件中增加以下配置:

<repositories>

<repository>

<id>maven-restlet</id>

<name>Restlet repository</name>

<url>http://maven.restlet.org</url>

</repository>

</repositories>

Feign框架介绍

Feign是一个Github上一个开源项目,目的是为了简化Web Service客户端的开发。在使用Feign时,可以使用注解来修饰接口被注解修饰的接口具有访问Web Service的能力,这些注解既包括Feign自带的注解,也支持使用第三方的注解除此之外,Feign还支持插件式的编码器和解码器,使用者可以通过该特性,对请求响应进行不同的封装解析。

Spring CloudFeign集成到netflix项目中,EurekaRibbon集成时,Feign就具有负载均衡的功能Feign本身在使用上的简便,加上与Spring Cloud高度整合,使用该框架在Spring Cloud中调用集群服务,将大大降低开发的工作量。

第一个Feign程序

先使用Feign编写一个Hello World的客户端,访问服务的“/hello”服务,得到返回的字符串。当前Spring Cloud所依赖的Feign版本为9.5.0,本章案例中的Feign也使用该版本。建立名称为“feign-clientMaven项目,加入以下依赖:

<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>

新建接口HelloClient,请见代码清单5-3

代码清单5-3codes\05\5.1\feign-client\src\main\java\org\crazyit\cloud\HelloClient.java

public interface HelloClient {

 

  @RequestLine("GET /hello")

  String sayHello();

}

HelloClient表示一个服务接口,接口的“sayHello”方法中,使用了@RequestLine注解,表示使用GET方法,向“/hello”发送请求。接下来编写客户端的运行类,请见代码清单5-4

代码清单5-4codes\05\5.1\feign-client\src\main\java\org\crazyit\cloud\HelloMain.java

public class HelloMain {

 

public static void main(String[] args) {

//调用Hello接口

HelloClient hello = Feign.builder().target(HelloClient.class,

"http://localhost:8080/");

System.out.println(hello.sayHello());

}

}

运行类中,使用Feign创建HelloClient接口的实例,最后调用接口定义的方法。运行代码清单5-4,可以看到返回的Hello World字符串,可见接口已经被调用。熟悉AOP的朋友大概已经猜到,Feign实际上会帮我们动态生成代理类Feign使用的是JDK的动态代理,生成的代理类,会将请求的信息封装,交给feign.Client接口发送请求,而该接口的默认实现类,最终会使用java.net.HttpURLConnection来发送HTTP请求。

请求参数与返回对象

本案例中有两个服务,另外一个地址为“/person/{personId}”,需要传入参数并且返回JSON字符串,编写第二个Feign客户端,调用该服务。新建PersonClient服务类,定义调用接口并添加注解,请见代码清单5-5

代码清单5-5codes\05\5.1\feign-client\src\main\java\org\crazyit\cloud\PersonClient.java

public interface PersonClient {

 

@RequestLine("GET /person/{personId}")

Person findById(@Param("personId") Integer personId);

@Data //为所有属性加上settergetter等方法

class Person {

Integer id;

String name;

Integer age;

String message;

}

}

定义的接口名称为“findById”,参数为“personId”。需要注意的是,由于会返回Person实例,我们在接口中定义了一个Person的类,为了减少代码量,使用了Lombok项目,使用该项目的@Data注解使用Lombok,需要添加以下Maven依赖:

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.16.18</version>

</dependency>

准备好提供服务的客户端类后,再编写运行类。运行类基本上与前面的HelloWorld类似,请见代码清单5-6

代码清单5-6codes\05\5.1\feign-client\src\main\java\org\crazyit\cloud\PersonMain.java

public class PersonMain {

 

public static void main(String[] args) {

PersonClient personService = Feign.builder()

.decoder(new GsonDecoder())

.target(PersonClient.class, "http://localhost:8080/");

Person person = personService.findById(2);

System.out.println(person.id);

System.out.println(person.name);

System.out.println(person.age);

System.out.println(person.message);

}

}

调用Person服务的运行类中,添加了解码器的配置,GsonDecoder会将返回的JSON字符串,转换为接口方法返回的对象,关于解码器等内容,将在后面章节中讲述。运行代码清单5-6,可以看到最终的输出。

本小节使用了CXFRestletFeign来编写REST客户端,在编写客户端的过程中,可以看到Feign的代码更加“面向对象”,至于是否更加简洁,则见仁见智。下面的章节,将深入了解Feign的各项功能。

 

 本文节选自《疯狂Spring Cloud微服务架构实战》

Spring Cloud教学视频http://www.crazyit.org/thread-11730-1-1.html

Spring Cloud电子书http://www.crazyit.org/thread-11737-1-1.html

本书代码共享地址:https://gitee.com/yangenxiong/SpringCloud

 楼主| 发表于 2017-11-19 17:02:05 | 显示全部楼层
好无聊啊,有没有人来灌水啊
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

视频、代码、电子书下载
请关注"疯狂图书"公众号
QQ交流1群: 545923995  未满
微信群请扫二维码
QQ交流1群:
545923995
(未满)

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2019-3-22 04:25 , Processed in 0.169073 second(s), 6 queries , File On.

快速回复 返回顶部 返回列表