一、什么是Feign:
Feign是应用在分布式系统中,可以进行远程调用,它使得调用远程服务更为简单和直观。
这个是Feign的基本流程。Feign在调用时可能会产生jdk代理对象,通过代理对象来调用远程的服务。该代理对象不仅可以接收到HTTP请求,而且还可以将相应信息封装为http请求作为响应发送给前端。 在调用方法处理器时,我们引入了熔断器Hystrix,在hystrix中通过调用HystrixInvocationHandler来实现远程调用。 二、流程演示:
- 建立Eureka远程服务注册中心
- 建立Client-provider
<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/eureka2.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的远程调用了
<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. 访问的应该是调用远程调用的端口。 借鉴Feign原理 (图解) - 疯狂创客圈 - 博客园 (cnblogs.com)
标签:Feign,调用,String,--,spring,test,组件,public,cloud From: https://www.cnblogs.com/qiang2023/p/17557887.html