前言
Spring Cloud系列文章大多是有联系的,最好是从第一篇开始看起
Spring Cloud系列: 点击查看Spring Cloud系列文章
调用接口的方法
java项目调用接口一般有以下几种方法
1、Httpclient
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。
HttpClient 相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变得容易,提高了开发的效率。
2、Okhttp
一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持多种协议(HTTP/2 和 SPDY)。
3、HttpURLConnection
HttpURLConnection 是 Java 的标准类,它继承自 URLConnection,可用于向指定网站发送 GET 请求、POST 请求。HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使用。
4、RestTemplate
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。
除了上面的方法,还有一种 更简单方便的方法,那就是Feign 。
Feign
Feign 是一个声明式的 REST 客户端,它能让 REST 调用更加简单。Feign 提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。而 Feign 则会完全代理 HTTP 请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。
Spring Cloud 对 Feign 进行了封装,使其支持 SpringMVC 标准注解和 HttpMessageConverters。Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡。
Feign和OpenFeign的区别
Feign 是 spring cloud 组件中的一个轻量级 RESTful 的HTTP 服务客户端 Reign 内置了 Ribbon, 用来做客户端服务在均衡,去调用服务注册中心的服务,Feign 的使用方式是:使用Feign 注解自定义接口,调用这个接口,就可以低哦啊用服务注册中心的服务。
openfeign 是 spring cloud 在 feign 的基础上支持 spring mvc 注解 ,如 @RequestMapping 等等,OpenFeign 的 @FeignClient 可以解析Spring MVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式生产实现类 ,实现类中做负载均衡并且低哦用其他服务。
OpenFeign也是默认集成了Ribbon
Spring Cloud OpenFeign
Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。它具备可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的编码器和解码器。Spring Cloud集成了Eureka和Spring Cloud LoadBalancer,以在使用Feign时提供负载平衡的http客户端。
Spring Cloud中集成Feign
1、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在启动类上添加@EnableFeignClients 注解,用于扫描定义的Feign 接口
@SpringBootApplication
@EnableFeignClients
public class ConsumersDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumersDemoApplication.class, args);
}
}
如果你的Feign 接口不在启动类的包下,还需要定义扫描路径
如:
@EnableFeignClients(basePackages = "com.Feign .api")
至此,我们就可以使用Feign调用接口了
Feign调用接口
3、定义Feign接口
@FeignClient("EUREKA-CLIENT-SERVICE")
public interface FeignClientInterface {
@GetMapping("/hello")
String hello();
}
说明:
@FeignClient注解标识这是一个Feign 的客户端,value 属性是对应的服务名称,也就是你需要调用哪个服务中的接口。
接口方法的定义跟实际方法定义一样即可,即入参、出参和名称相同即可。
调用FeignClientInterface 接口中的hello方法,就相当于调用http://EUREKA-CLIENT-SERVICE/hello
调用FeignClient接口,我们只需要在调用的类上注入FeignClient接口,然后执行相应的方法即可,如下
@SpringBootTest
class ConsumersDemoApplicationTests {
@Autowired
private FeignClientInterface feignClientInterface;
@Test
void testMethod(){
String result = feignClientInterface.hello();
System.out.println(result);
}
}
成功输出hello
@FeignClient注解属性
以下是FeignClient 的定义
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {
@AliasFor("name")
String value() default "";
@Deprecated
String serviceId() default "";
String contextId() default "";
@AliasFor("value")
String name() default "";
String qualifier() default "";
String url() default "";
boolean decode404() default false;
Class<?>[] configuration() default {};
Class<?> fallback() default void.class;
Class<?> fallbackFactory() default void.class;
String path() default "";
boolean primary() default true;
}
FeignClient属性
name和value
从源码可以得知,name是value的别名,value也是name的别名。两者的作用是一致的,name指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现。
url
url属性一般用于调试程序,允许我们手动指定@FeignClient调用的地址
decode404
当发生http 404错误时,如果该字段为true,会调用decoder进行解码,否则抛出FeignException。
configuration
用于指明FeignClient的配置类,默认的配置类为FeignClientsConfiguration类。,在缺省情况下,这个类注入了默认的Decoder、Encoder和Constant等配置的bean。
Feign配置文件配置
feignName表示服务的名称,如果想设置全局配置,只需要换成feign.client.config.default 即可
# 链接超时时间
feign.client.config.feignName.connectTimeout=5000
# 读取超时时间
feign.client.config.feignName.readTimeout=5000
# 日志等级
feign.client.config.feignName.loggerLevel=full
#开启压缩
feign.compression.request.enabled=true
feign.compression.response.enabled=true