微服务学习---组件 远程调用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);
    }

}

3. 建立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接口 接口的泛型便是我们在 第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. 访问的应该是调用远程调用的端口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Feign远程调用中,事务控制是一个比较复杂的问题。Feign本身并不直接支持事务控制,因为它是一个用于远程服务调用的工具,而事务控制通常是在应用程序的业务逻辑层面进行处理的。 如果你需要在Feign远程调用中实现事务控制,你可以考虑以下几种方式: 1. 分布式事务管理器:使用分布式事务管理器,如Spring Cloud的分布式事务管理器或者Seata等,来管理Feign远程调用中的事务。这样可以确保在跨服务调用时,事务的一致性和隔离性得到保证。 2. 本地事务补偿:在Feign远程调用中,可以通过本地事务补偿的方式来实现事务控制。即在调用方的本地事务中,记录下需要调用的远程服务的操作,如果本地事务成功提交,则再调用远程服务进行相应的操作。如果本地事务失败,则进行相应的事务回滚。 3. 异步消息:使用异步消息的方式来实现事务控制。即在调用方的本地事务中,将需要调用的远程服务的操作发送到消息队列中,然后由消息队列来保证事务的一致性和隔离性。 需要注意的是,以上方法都需要在应用程序的业务逻辑层面进行相应的处理和配置,具体的实现方式会根据你的业务需求和技术栈而有所不同。同时,对于分布式事务的处理,还需要考虑到分布式事务的一致性和性能等方面的问题。 综上所述,Feign本身并不直接支持事务控制,但可以通过使用分布式事务管理器、本地事务补偿或异步消息等方式来实现Feign远程调用的事务控制。具体的实现方式需要根据你的业务需求和技术栈来确定。 #### 引用[.reference_title] - *1* *2* *3* [微服务组件Feign远程服务调用](https://blog.csdn.net/Wang_Dong_Liang/article/details/127633506)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值