[微服务学习 --组件] 远程调用 Feign

一、什么是Feign:

  Feign是应用在分布式系统中,可以进行远程调用,它使得调用远程服务更为简单和直观。

 

 

  这个是Feign的基本流程。Feign在调用时可能会产生jdk代理对象,通过代理对象来调用远程的服务。该代理对象不仅可以接收到HTTP请求,而且还可以将相应信息封装为http请求作为响应发送给前端。
 
        在调用方法处理器时,我们引入了熔断器Hystrix,在hystrix中通过调用HystrixInvocationHandler来实现远程调用。
 
 二、流程演示:
  1.     建立Eureka远程服务注册中心
  2.     建立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);
    }

}

 

  1.     建立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.    访问的应该是调用远程调用的端口。
 

 

posted @ 2023-07-16 15:13  forshine123  阅读(41)  评论(0编辑  收藏  举报