首页 > 其他分享 >Feign远程调用结合fallback(Springboot包扫描)

Feign远程调用结合fallback(Springboot包扫描)

时间:2023-02-17 10:47:56浏览次数:57  
标签:findById Feign java Springboot feign id UserClient fallback order

Feign远程调用结合fallback(Springboot包扫描)

微服务项目中,各微服务模块间互相调用,通常使用HTTP协议调用,为了优雅和快速调用服务,通常使用HTTP客户端,如Feign

为各服务编写Feign客户端应当是一次编写重复调用的过程,因此Feign客户端应当作为一个独立工具包引入,在这种情况下,讨论Feign的远程调用及其fallback的熔断机制

项目基本架构

nacos集群

#2023-02-16T20:21:18.756
192.168.8.103:8845
192.168.8.103:8846
192.168.8.103:8847

nacos服务列表

userSercvice - 用户信息查询服务
orderService - 订单查询服务,调用了userServcie

nginx负载均衡nacos集群

将三个nacos负载均衡到 http://nacos-cluster:8848

	upstream nacos-cluster {
		server 127.0.0.1:8845;
		server 127.0.0.1:8846;
		server 127.0.0.1:8847;
	}

	server {
		listen       8848;
		server_name  localhost;

		location /nacos {
			proxy_pass http://nacos-cluster;
		}
	}

feigh-api

SpringCloud微服务模块,但是没有启动类

win下获取文件夹目录结构可以使用 tree 命令, /f 表包含文件

tree /f

└─cn
    └─itcast
        └─feign
            ├─clients
            │      UserClient.java
            │
            ├─fallback
            │      UserClientFallback.java
            │
            └─pojo
                    User.java

UserClient.java

// 包含一个HTTP请求 /user/{id} 返回实体类User
// 包含一个fallback=UserClientFallback.class
@FeignClient(value = "userService", fallback = UserClientFallback.class)
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

UserClientFallback.java

注意:这里@Component 是为了让外部的SpringBoot项目能够扫描到 UserClientFallback

而不是feign-api 这个项目扫描到(没有启动类扫描不到啦)

// 一个简单的fallback,返回一个id=0的空User对象

@Component
public class UserClientFallback implements UserClient {
    private static final User USER_FALLBACK = new User(0L, null, null);
    @Override
    public User findById(Long id) {
        return USER_FALLBACK;
    }
}

pom.xml

父pom包含了SpringBoot

<parent>
    <artifactId>cloud-demo</artifactId>
    <groupId>cn.itcast.demo</groupId>
    <version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcast.feign</groupId>
<artifactId>feign-api</artifactId>

order-service

SpringCloud微服务模块结构

└─cn
    └─itcast
        └─order
            │  OrderApplication.java(SpringBootApplication启动类)
            │
            ├─mapper
            │      OrderMapper.java
            │
            ├─pojo
            │      Order.java
            │
            ├─service
            │      OrderService.java
            │
            └─web
                    OrderController.java

引用feign-api

pom.xml

<!--my.feign.api.module-->
<dependency>
    <groupId>cn.itcast.feign</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

application.yaml

必须开启

# feign
feign:
  hystrix: # 配置服务降级(熔断)
    enabled: true

使用UserClient

  • OrderApplication.java - 启动类

  • // 完整的包扫描路径,包含当前order-service微服务中的包,和feign-api模块下的包路径
    @SpringBootApplication(scanBasePackages = {"cn.itcast.order", "cn.itcast.feign"})
    @EnableFeignClients(clients = {UserClient.class}) // 开启FeignClient,指定要使用的类
    public class OrderApplication {}
    
  • OrderService.java - 使用

  • @Service
    public class OrderService {
        
        // 引入Feign客户端
        @Resource
    	private UserClient userClient;
        
        // 调用
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2. Feign 发送请求
            User user = userClient.findById(order.getUserId());
            // 3. 封装
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    

效果 Feign.log.level=BASIC

  • 熔断

  • {"id":102,"price":209900,"name":"雅迪 yadea 新国标电动车","num":1,"userId":2,"user":{"id":0,"username":null,"address":null}}
    
    ------------------------------------------------------
    
    02-17 10:23:10:307 DEBUG 10036 --- [nio-8080-exec-3] c.i.order.mapper.OrderMapper.findById    : ==>  Preparing: select * from tb_order where id = ? 
    02-17 10:23:10:307 DEBUG 10036 --- [nio-8080-exec-3] c.i.order.mapper.OrderMapper.findById    : ==> Parameters: 102(Long)
    02-17 10:23:10:308 DEBUG 10036 --- [nio-8080-exec-3] c.i.order.mapper.OrderMapper.findById    : <==      Total: 1
    02-17 10:23:10:309 DEBUG 10036 --- [x-userService-5] cn.itcast.feign.clients.UserClient       : [UserClient#findById] ---> GET http://userService/user/2 HTTP/1.1
    02-17 10:23:12:313 DEBUG 10036 --- [x-userService-5] cn.itcast.feign.clients.UserClient       : [UserClient#findById] <--- ERROR HttpHostConnectException: Connect to 192.168.8.103:8081 [/192.168.8.103] failed: Connection refused: connect (2003ms)
    
  • 正常

  • {"id":102,"price":209900,"name":"雅迪 yadea 新国标电动车","num":1,"userId":2,"user":{"id":2,"username":"文二狗","address":"陕西省西安市"}}
    
    ------------------------------------------------------
    
    02-17 10:22:15:165 DEBUG 10036 --- [nio-8080-exec-7] c.i.order.mapper.OrderMapper.findById    : ==>  Preparing: select * from tb_order where id = ? 
    02-17 10:22:15:165 DEBUG 10036 --- [nio-8080-exec-7] c.i.order.mapper.OrderMapper.findById    : ==> Parameters: 102(Long)
    02-17 10:22:15:166 DEBUG 10036 --- [nio-8080-exec-7] c.i.order.mapper.OrderMapper.findById    : <==      Total: 1
    02-17 10:22:15:167 DEBUG 10036 --- [x-userService-4] cn.itcast.feign.clients.UserClient       : [UserClient#findById] ---> GET http://userService/user/2 HTTP/1.1
    02-17 10:22:15:329 DEBUG 10036 --- [x-userService-4] cn.itcast.feign.clients.UserClient       : [UserClient#findById] <--- HTTP/1.1 200  (160ms)
    

标签:findById,Feign,java,Springboot,feign,id,UserClient,fallback,order
From: https://www.cnblogs.com/jentreywang/p/17129278.html

相关文章

  • 基于springboot实现SSM整合
    (1)SpringBoot整合Spring(不存在)(2)SpringBoot整合SpringMVC(不存在)(3)SpringBoot整合MyBatis(主要)一、新建springboot项目。  在application.yml配置文件中添加数据源......
  • springboot整合junit
    packagecom.itheima1;importcom.itheima.Springboot07TestApplication;importcom.itheima.service.BookService;importorg.junit.jupiter.api.Test;importorg.s......
  • springboot多环境开发兼容问题(Maven和boot)
    <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:sch......
  • springboot---多环境启动命令格式
    一、多环境命令启动maven插件中首先clean,再package打包,(修改字符集为UTF-8)使用cmd命令java-jars(Tab键自动补全) -spring.profiles.active=test启动项目  修改端......
  • Springboot项目中注入bean失败的问题排查
    Springboot项目中注入bean失败的问题排查这是一个Spring常见的问题,下面我们从测试方法和普通方法出问题两个角度来下如何解决测试方法先查看目录是否有误测试类的包名......
  • springboot基础配置yml
    yaml语法规则大小写敏感属性层级关系使用多行描述,每行结尾使用冒号结束使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)属性值前面添加空格(属性名与属......
  • springboot自定义校验工具类
    参考:https://betheme.net/news/txtlist_i120686v.html?action=onClickhttps://www.ngui.cc/el/2571188.html?action=onClick一、原生注解在springboot中,我们可以使用ja......
  • Hystrix + OpenFeign+ SpringCloud +Nacos
      注意:2023年2月 springcloud最新版本不支持nacos2.2和hystrix,测试发现以下这个版本还支持<groupId>org.springframework.cloud</groupI......
  • SpringBoot
    一.SpringBoot 1.1SpringBoot概述1.1.1什么是SpringBootSpringBoot是Spring项目中的一个子工程,与我们所熟知的Spring-framework同属于spring的产品:其最主......
  • springboot 使用微信支付
    参考:Java实现微信支付_被编程征服的秃发女子的博客-CSDN博客一.微信支付流程支付流程:用户点击支付按钮调用接口[/deposit]=>返回给小程序payInfo和订单编号orderNum......