[微服务学习 --组件] 远程调用 Feign
一、什么是Feign:
Feign是应用在分布式系统中,可以进行远程调用,它使得调用远程服务更为简单和直观。
这个是Feign的基本流程。Feign在调用时可能会产生jdk代理对象,通过代理对象来调用远程的服务。该代理对象不仅可以接收到HTTP请求,而且还可以将相应信息封装为http请求作为响应发送给前端。
在调用方法处理器时,我们引入了熔断器Hystrix,在hystrix中通过调用HystrixInvocationHandler来实现远程调用。
二、流程演示:
-
建立Eureka远程服务注册中心
-
建立Client-provider
2.1 配置pom文件
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2 修改配置文件application.properties
server.port=8083
spring.application.name=0704-spring-cloud-hystrix-feign
eureka.client.service-url.defaultZone=http://localhost:9100/eureka
2.3 添加 model.User类 相当于pojo类型 添加两个属性:
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User implements Serializable {
private String name;
private int age;
}
2.4 控制类 controller.TestController
@RestController
public class TestController {
@RequestMapping("/test")
public String test(){
return "使用了feign的服务提供者";
}
@RequestMapping("/testParam01")
public String testParam01(String name,int age){
return "使用了feign的服务提供者"+name+""+age;
}
@RequestMapping("/testREturnUser")
public User testREturnUser(){
return new User("lily",24);
}
}
- 建立Client-Consumer模块 就可以使用Feign的远程调用了
3.1 pom文件中添加配置文件:
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--添加断路器的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.2修改配置文件
server.port=8086
spring.application.name=0704-spring-cloud-hystrix-feign-consumer
eureka.client.service-url.defaultZone=http://localhost:9100/eureka
3.3 构建model 类 和provider中的一致
3.4 构建service 这是个接口,里边的内容和provider中的 controller的方法一样,但是没有方法体。
该接口会添加一个 @FeignClient标签 这个标签可以标识该接口可以产生一个jdk代理对象,来完成远程调用。
/**添加该标签会给其创建一个代理对象 并将其代理对象加入到bean容器中
生成的代理对象的特点:
1.该代理对象可以处理http的请求信息,并将http请求信息进行封装
2.该代理对象可以发送http响应
**/
@FeignClient(name = "0704-spring-cloud-hystrix-feign",fallbackFactory = MyCallbackFactory.class)
public interface TestService {
@RequestMapping("/test")
public String test();
@RequestMapping("/testParam01")
public String testParam01(String name,int age);
@RequestMapping("/testREturnUser")
public User testREturnUser();
}
3.5 创建熔断类 hystrix.MyCallbackFactory 该类会实现FallbackFactory<T>接口 接口的泛型便是我们在 第3.4步创建的service接口。
FallbackFactory接口的作用是:定义回退逻辑 在发生熔断时,可以降级服务。
@Component
public class MyCallbackFactory implements FallbackFactory<TestService> {
@Override
public TestService create(Throwable throwable) {
return new TestService() {
@Override
public String test() {
System.out.println(throwable.getClass());
System.out.println(throwable.getMessage());
return "test方法被熔断了:"+throwable.getMessage();
}
@Override
public String testParam01(String name, int age) {
return null;
}
@Override
public User testREturnUser() {
return null;
}
};
}
}
3.6 定义 controller类进行实现
@RestController
public class TestController {
@Autowired
private TestService testService;
@RequestMapping("/test")
public String test(){
String body = testService.test();
return "使用了feign的服务消费者123456...."+body;
}
@RequestMapping("/testParam01")
public String testParam01(String name,Integer age){
return "使用了feign的服务提供者...."+name+" "+age;
}
@RequestMapping("/testReturnUser")
public User testReturnUser(){
return new User("lily",66);
}
}
4.测试:
4.1 首先去访问一下 Eureka注册中心 看有没有注册成功:访问:http://localhost:9100/
4.2 访问 客户端的路径观察远程调用
首先分析:
在我们的 服务提供端,控制器中 我们输出的是:
@RequestMapping("/test")
public String test(){
return "使用了feign的服务提供者";
}
也就是说 ,如果我们直接访问服务提供者的地址:http://localhost:8083/test得到的结果为:使用了“feign的服务提供者”。
而在我们的,服务消费端,我们控制器调用了,服务消费端的service方法,而在我们的服务消费端的service层,我们开启了远程调用@FeignClient,并且定义了逻辑回退方法,也就是FallBackFactory的实现类,也就是我们在此处会使用到回退方法,且进行远程调用,如果远程的服务提供者的方法,出现了错误,那么就会出发熔断。
controller层:
@RequestMapping("/test")
public String test(){
String body = testService.test();
return "使用了feign的服务消费者123456...."+body;
}
service层:
@FeignClient(name = "0704-spring-cloud-hystrix-feign",fallbackFactory = MyCallbackFactory.class)
public interface TestService {
此时访问:http://localhost:8086/test:
三、总结:
1. 当我们在一个请求中需要用到另外一个请求的数据时,我们可能就会使用到远程调用了。
2. 在使用远程调用时,注意要把pom文件中,添加对应的依赖。(服务提供者,服务消费者)
3. 注意定义逻辑回退。
4. 访问的应该是调用远程调用的端口。