什么是Feign,Feign如何使⽤,Feign与CXF的区别(包括如何使⽤
Feign⾃定。。。
第⼀个Feign程序
编码器:如果服务端只接受JSON字符串格式/XML,那么我们客户端使⽤的是对象。在这种情况下,我们可以使⽤编码器将对象转换成JSON字符串/XML。
解码器:将服务端的响应结果对象,转换为客户端的对象。这个时候就需要⽤到解码器。
1. Feign被集成到SpringCloud Netflix模块,当Eureka,Ribbon集成的时候呢,Feign就具备了负载均衡的功能。Feign本⾝使⽤就很简便,再加上与
SpringCloud的整合,将很⼤程度上降低我们开发的⼯作量。
2. 它是Github上⾯的⼀个开源项⽬,⽬的是为了简化WebService客户端的开发,在使⽤Feign的时候可以使⽤注解来修饰接⼝,被修饰的接⼝就具有
了访问webservice的能⼒,这些注解呢可以使⽤Feign的⾃带注解,也可以⽀持使⽤第三⽅的注解。Feign还⽀持插件式的编码器和解码器,使⽤者可以通过这些特性,对请求和响应进⾏封装和解析。
Feign会更加的⾯向对象,下⾯我们使⽤Feign来对⽐⼀下CXF。在这之前我们需要准备对外提供接⼝。
如果没有接⼝等项⽬的朋友,可以参照前⼏章的“”搭建(只搭建服务器与服务提供者即可)
这⾥我们⼀次把依赖CXF、Feign的依赖全部引⼊:l
<dependencies>
<!-- CXF 依赖 -->
<dependency>
<groupId>f</groupId>
<artifactId>cxf-core</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>f</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>
<!-- 如果请求格式⽤XML的时候,需要加⼊以下XML依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jaxb</artifactId>
<version>9.5.0</version>
</dependency>
<dependency>
<groupId&l.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.8</version>
</dependency>
</dependencies>
下⾯我们编写⼀个CXF客户端,进⾏测试:CxfClient.java
public class CxfClient {
public static void main(String[] args) throws IOException {
// 创建 WebClient
WebClient client = ate("localhost:9090/getPoliceById/123");
// 获取响应
Response response = ();
// 获取响应内容
InputStream is = (InputStream) Entity();
String content = adStringFromStream(is);
// 打印结果
System.out.println("请求结果:" + content);
}
}
乱码的问题不⽤管,我们就看 ate ⽅法中的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) {
}
}
其次,我们创建⼀个接⼝类: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);
/**
* 发送JSON对象,返回字符串
springcloud怎么读音
* @param police
* @return
*/
@RequestLine("POST /createPolice")
@Headers("Content-Type: application/json")// 这⾥要指定请求类型
public String createPolice(Police police);
/**
* 发送XML对象,返回字符串
* @return
*/
@RequestLine("POST /createXmlPolice")
@Headers("Content-Type: application/xml")// 这⾥要指定请求类型
public Police createXmlPolice(Police police);
}
最后,我们再创建⼀个测试类,查看结果:TestMain.java
public static void main(String[] args) {
/**
* 根据ID获取派出警察,返回JSON字符串
*/
FeignService client_1 = Feign.builder().target(FeignService.class, "localhost:9090");
String policeStr = Police();
System.out.println("返回JSON字符串:"+policeStr);
String policeByIdStr = PoliceById("123");
System.out.println("根据ID获取派出警察,返回JSON字符串:"+policeByIdStr);
/**
* 返回警察对象
*/
FeignService client_2 = Feign.builder().decoder(new GsonDecoder()).target(FeignService.class, "localhost:9090");
Police police = PoliceObj();
System.out.println("返回警察对象:");
System.out.println(" url:"+Url());
System.out.println(" message:"+Message());
/**
* 发送JSON对象,返回字符串
*/
FeignService client_3 = Feign.builder().encoder(new GsonEncoder()).target(FeignService.class, "localhost:9090");
Police police_json = new Police();
police_json.setMessage("你好");
String createResult = atePolice(police_json);
System.out.println("发送JSON格式参数,返回字符串:"+createResult);
/**
* 发送XML对象,返回字符串
* 使⽤XML进⾏发送与接收时,实体类需要使⽤注解:
* 类上注解:@XmlRootElement
* 字段注解:@XmlElement
* get⽅法使⽤注解:@XmlTransient
*/
JAXBContextFactory encoder = new JAXBContextFactory.Builder().build();
FeignService client_4 = Feign.builder()
.encoder(new JAXBEncoder(encoder))
.decoder(new JAXBDecoder(encoder))
.target(FeignService.class, "localhost:9090");
Police police_xml = new Police();
police_xml.setMessage("你好");
Police policeResult = ateXmlPolice(police_xml);
System.out.println("发送XML格式参数,返回字符串:"+Message());
}
但是如果向接⼝传⼊xml格式值,那接⼝应该怎么定义呢?
// 接收xml,返回xml
@RequestMapping(value="/createXmlPolice", method=RequestMethod.POST, produces=MediaType.APPLICATION_XML_VALUE, consumes=MediaType.APPLICATION_XML_VALUE) public String createXmlPolice(@RequestBody Police police){
return "<police><message>"+Message()+"</message></police>";
}
OK,这样⼦就可以传递xml格式的参数了。。。那么下⾯贴⼀下以上main⽅法中的所有执⾏结果
额外再说⼀下,Feign的客服端也是可插拔的,,下⾯教⼤家如何实现⾃定义客户端,并访问
⾸先需要⾃定义⼀个客户端,需要实现Feign的Client接⼝:MyClient.java
public class MyClient implements Client {
@Override
public Response execute(Request request, Options options) throws IOException {
try {
// 创建⼀个默认的客户端
CloseableHttpClient httpClient = ateDefault();
// 获取调⽤的HTTP⽅法
final String method = hod();
// 创建⼀个HttpClient的Request
HttpRequestBase httpRequest = new HttpRequestBase() {
@Override
public String getMethod() {
return method;
}
};
// 设置请求地址
httpRequest.setURI(new URI(request.url()));
// 执⾏请求,获取响应
HttpResponse httpResponse = ute(httpRequest);
// 获取响应的主体内容
byte[] body = Entity());
/
/ 将HttpClient的响应对象转换为Feign的Response
Response feignResponse = Response.builder()
.body(body)
.headers(new HashMap<String, Collection<String>>())
.StatusLine().getStatusCode())
.build();
return feignResponse;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
编写⼀个测试main⽅法:
/**
* 使⽤可插拔式的⾃定义client客户端,进⾏请求访问
*/
FeignService client_5 = Feign.builder().client(new MyClient()).target(FeignService.class, "localhost:9090");
String policeStr = Police();
System.out.println("返回JSON字符串:"+policeStr);
下⾯贴上运⾏结果
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论