本文节选自《疯狂Spring Cloud微服务架构实战》html
京东购买地址:https://item.jd.com/12256011.htmljava
当当网购买地址:http://product.dangdang.com/25201393.htmlgit
Spring Cloud教学视频:https://my.oschina.net/JavaLaw/blog/1552993apache
Spring Cloud电子书:https://my.oschina.net/JavaLaw/blog/1570383架构
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.javaui
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.javaurl
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,咱们将在后面章节中讲述。
本文节选自《疯狂Spring Cloud微服务架构实战》
Spring Cloud教学视频:https://my.oschina.net/JavaLaw/blog/1552993
Spring Cloud电子书:https://my.oschina.net/JavaLaw/blog/1570383
本书代码共享地址:https://gitee.com/yangenxiong/SpringCloud