疯狂Spring Cloud连载(12)———自定义Feign客户端


声明:本文转载自https://my.oschina.net/JavaLaw/blog/1556271,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

        本文节选自《疯狂Spring Cloud微服务架构实战》,本书将于2017年11月出版。

        Spring Cloud教学视频:https://my.oschina.net/JavaLaw/blog/1552993

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

12 自定义Feign客户端

        Feign使用一个Client接口来发送请求,默认情况下,使用HttpURLConnection连接HTTP服务。与前面的编码器类似,客户端也采用了插件式设计,也就是说,我们可以实现自己的客户端。本小节将使用HttpClient来实现一个简单的Feign客户端。为pom.xml加入HttpClient的依赖:

		<dependency> 			<groupId>org.apache.httpcomponents</groupId> 			<artifactId>httpclient</artifactId> 			<version>4.5.2</version> 		</dependency>

        新建feign.Client接口的实现类,具体实现请见代码清单5-13。

        代码清单5-13:codes\05\5.2\feign-use\src\main\java\org\crazyit\feign\MyFeignClient.java

public class MyFeignClient implements Client {  	public Response execute(Request request, Options options) 			throws IOException { 		System.out.println("====  这是自定义的Feign客户端"); 		try { 			// 创建一个默认的客户端 			CloseableHttpClient httpclient = HttpClients.createDefault(); 			// 获取调用的HTTP方法 			final String method = request.method(); 			// 创建一个HttpClient的HttpRequest 			HttpRequestBase httpRequest = new HttpRequestBase() { 				public String getMethod() { 					return method; 				} 			}; 			// 设置请求地址 			httpRequest.setURI(new URI(request.url())); 			// 执行请求,获取响应 			HttpResponse httpResponse = httpclient.execute(httpRequest); 			// 获取响应的主体内容 			byte[] body = EntityUtils.toByteArray(httpResponse.getEntity()); 			// 将HttpClient的响应对象转换为Feign的Response 			Response response = Response.builder() 					.body(body) 					.headers(new HashMap<String, Collection<String>>()) 					.status(httpResponse.getStatusLine().getStatusCode()) 					.build(); 			return response; 		} catch (Exception e) { 			throw new IOException(e); 		} 	} } 

        简单讲一下自定义Feign客户端的实现过程,在实现execute方法时,将Feign的Request实例,转换为HttpClient的HttpRequestBase,再使用CloseableHttpClient来执行请求,得到响应的HttpResponse实例后,再转换为Feign的Reponse实例返回。不仅我们实现的客户端,包括Feign自带的客户端以及其他扩展的客户端,实际上就是一个对象转换的过程。在运行类中直接使用我们的自定义客户端,请见代码清单5-14。

        代码清单5-14:codes\05\5.2\feign-use\src\main\java\org\crazyit\feign\MyClientTest.java

public class MyClientTest {  	public static void main(String[] args) { 		// 获取服务接口 		PersonClient personClient = Feign.builder() 				.encoder(new GsonEncoder()) 				.client(new MyFeignClient()) 				.target(PersonClient.class, "http://localhost:8080/"); 		// 请求Hello World接口 		String result = personClient.sayHello(); 		System.out.println("    接口响应内容:" + result); 	} } 

        运行代码清单5-14,输出如下:

====  这是自定义的Feign客户端     接口响应内容:Hello World

        注意:在本例的实现中,笔者简化了实现,自定义的客户端中并没有转换请求头等信息,因此使用本例的客户端,无法请求其他格式的服务。

        虽然Feign也有HttpClient的实现,但本例的目的主要是向大家展示Feign客户的原理。举一反三,如果我们实现一个客户端,在实现中调用Ribbon的API,来实现负载均衡的功能,是完全可以实现的。幸运的是,Feign已经帮我们实现了RibbonClient,可以直接使用,更进一步,Spring Cloud也实现自己的Client,我们将在后面章节中讲述。

本文发表于2017年10月26日 10:34
(c)注:本文转载自https://my.oschina.net/JavaLaw/blog/1556271,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2020 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1