diff --git a/note/springCloudNetflix-7-28.md b/note/springCloudNetflix-7-28.md new file mode 100644 index 0000000000000000000000000000000000000000..e802934a722c3802d619fedacc674cd5bd96d2ba --- /dev/null +++ b/note/springCloudNetflix-7-28.md @@ -0,0 +1,75 @@ +[toc] + +# SpringCloudNetflix-day02 + +## 1.RestTemplate服务通信 + +- RestTemplate是spring基于restful封装的简单的Http客户端工具,可以通过它来实现服务之间的通信。RestTemplate本身不具备服务发现和负载均衡的功能 + +## 2.Ribbon客户端负载均衡 + +- Ribbon是Netflix发布的云中间层服务开源项目,主要提供负载均衡算法的功能。Ribbon客户端组件提供一系列完善的配置项。Ribbon可以按照负载均衡算法向多个服务发起调用 + +### 1.Ribbon工作机制 + +- Ribbon会根据指定的服务名,根据服务名在通信地址清单中找到对应服务的通信地址,然后Ribbon按照负载均衡算法选择某一个通信地址,通过RestTemplate发起http请求,实现服务的调用。 + +### 2.负载均衡算法 + +- RoundRobinRule(默认) + - 简单的轮询列表来选择服务器 +- AvailabilityFilteringRule + - 对以下两种服务器进行忽略 + 1. 默认情况下,如果服务器三次连接失败,这台服务器会设置为“短路”状态。可以通过配置loadbalancer.connectionFilureCountThreshold来指定连接失败多少次之后设置为短路状态 + 2. 并发数过高的服务器,并发连接数的上限,可有客户端的ActiveConnectionsLimit设置 +- WeightedResponseTimeRule + - 为每个服务器赋予一个权重值。服务器响应时间越长,这个服务器权重越小。这个规则随机选择服务器,权重值会影响服务器的选择 +- ZoneAvoidanceRule + - 以区域可用的服务器为基础进行服务器的选择,使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。 +- BestAvailableRule + - 忽略哪些短路服务器,并选择并发数较低的服务器 +- RandomRule + - 随机选择一个可用的服务器 +- Retry + - 重试机制选择逻辑 + +## 3.OpenFeign客户端负载均衡 + +- 基于Ribbon进行了封装。Feign是一个声明式的http客户端,使用feign可以实现声明式rest调用,它的目的就是让web service调用更加简单。Feign整合了Ribbon和springmvc注解,这让feign的客户端接口看起来像一个controller,feign提供了http请求的模板,通过编写简单的接口和插入注解,就可以定义好http请求的参数、格式、地址等信息。feign会安全代理http请求,可以像调用方法一样调用feign完成服务请求。同时feign整合了hystrix,可以很容易的实现服务熔断和降级 + +## 4.Hystrix熔断器 + +- Hystrix是处理依赖隔离的框架,将出现故障的服务通过熔断、降级等手段隔离服务,这样不会影响整个系统的主业务,同时也可以做服务的治理和监控 + +### 1.hystrix设计原则 + +1. 防止单个服务异常导致整个微服务故障 +2. 快速失败,如果服务出现故障,服务请求快速失败,线程不会等待 +3. 服务降级,请求故障可以返回设定好的兜底数据 +4. 熔断机制,防止故障的扩散,导致整个服务瘫痪 +5. 服务监控,提供了hystrix bashboard仪表盘,实时监控熔断器状态 + +### 2.hystrix的功能 + +#### 1.资源隔离 + +- 资源隔离包括线程池隔离和信号量隔离,作用是限制分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。资源隔离就是限制请求的数量 + - 线程池隔离:使用一个线程池来存储当前请求,线程池对请求做处理,设置任务返回处理超时时间,堆积的请求先入线程池队列。这种方式要为每个依赖服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可以将数据存储到线程池队列里慢慢处理) + - 信号量隔离:使用一个原子计数器记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃该类型的请求,若不超过则会执行请求并计数器+1,如果请求返回计数器-1.这种方式是严格的控制线程且立即返回模式,无法应对突发流量 + +#### 2.服务熔断 + +- 熔断机制是对服务链路的保护机制,如果链路上的某个服务不可访问,调用超时,发生异常等,服务会触发降级返回托底数据,然后熔断服务的调用(失败率达到某个阈值服务标记为短路状态),当检查到该节点能正常使用是服务会快速恢复 + +#### 3.降级机制 + +- 超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据 + +#### 4.缓存 + +- 提供了请求缓存、请求合并实现,在高并发下,hystrix请求缓存可以方便地开启和使用请求缓存来优化系统,达到减轻高并发时请求线程的消耗、降低请求响应时间的效果 + +### 3.hystrix工作机制 + +- 正常情况下,熔断器处于关闭状态(closed),如果调用持续出错或者超时到达设定的阈值,电路被打开进入熔断状态(open),这是请求这个服务会触发快速失败(立马返回兜底数据,不让线程死等),后续一段时间内所有的调用都会被拒绝(Fail Fast),一段时间之后(withCircuitBreakerSleepWindowInMilliseconds=5s),保护器会尝试进入半熔断状态(half-open),允许少量请求进行尝试,如果调用依然失败,则回到熔断状态,如果调用成功,则回到电路闭合状态,取消熔断状态。 + diff --git a/pom.xml b/pom.xml index 2b32217bba30c99d14f1c59b5d0e8400822fbabd..861af0596d52b72e119544d88875848a6c5b3341 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ spring-cloud-user-server spring-cloud-order-server spring-cloud-common + spring-cloud-pay-server pom diff --git a/spring-cloud-order-server/pom.xml b/spring-cloud-order-server/pom.xml index 91e6e41fc84f1a42776c18f7aab1fd2dc435f74f..69b2caf07da5ad20f6746ca33afca70a0e234938 100644 --- a/spring-cloud-order-server/pom.xml +++ b/spring-cloud-order-server/pom.xml @@ -34,5 +34,10 @@ org.springframework.cloud spring-cloud-starter-netflix-ribbon + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix + \ No newline at end of file diff --git a/spring-cloud-order-server/src/main/java/cn/mobius/OrderServerApplication.java b/spring-cloud-order-server/src/main/java/cn/mobius/OrderServerApplication.java index 48fffbf99eadb4d39708360bee0569d3fd540c14..bb4ff77d7849810f6b5864cf8644eadf64245edf 100644 --- a/spring-cloud-order-server/src/main/java/cn/mobius/OrderServerApplication.java +++ b/spring-cloud-order-server/src/main/java/cn/mobius/OrderServerApplication.java @@ -1,7 +1,9 @@ package cn.mobius; +import com.netflix.loadbalancer.RandomRule; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; @@ -9,6 +11,7 @@ import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableEurekaClient +@EnableCircuitBreaker // 开启hystrix public class OrderServerApplication { public static void main(String[] args) { SpringApplication.run(OrderServerApplication.class,args); @@ -19,4 +22,13 @@ public class OrderServerApplication { public RestTemplate getRestTemplate() { return new RestTemplate(); } + + /** + * 全局配置:指定ribbon负载均衡分配算法 + * 随机算法 + */ + @Bean + public RandomRule randomRule() { + return new RandomRule(); + } } diff --git a/spring-cloud-order-server/src/main/java/cn/mobius/controller/OrderCtrl.java b/spring-cloud-order-server/src/main/java/cn/mobius/controller/OrderCtrl.java index 48ff547789326dc02cf57393065f16f4612f5fdc..7701dc565b9dcd57898acbdac3b576fd726c2bbc 100644 --- a/spring-cloud-order-server/src/main/java/cn/mobius/controller/OrderCtrl.java +++ b/spring-cloud-order-server/src/main/java/cn/mobius/controller/OrderCtrl.java @@ -1,5 +1,6 @@ package cn.mobius.controller; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import domain.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -10,16 +11,30 @@ import org.springframework.web.client.RestTemplate; @RestController @RequestMapping("/order") +//@DefaultProperties(defaultFallback = "getByUserIdFallbackMethod") // 同一降级配置 public class OrderCtrl { @Autowired(required = false) private RestTemplate restTemplate; + @GetMapping("/getByUserId/{id}") + @HystrixCommand(fallbackMethod = "getByUserIdFallbackMethod") // 指定降级方法 public User getByUserId(@PathVariable Long id){ // 直接使用服务名请求 String url = "http://user-server/user/getByUserId/" + id; return restTemplate.getForObject(url, User.class); } + /** + * 降级方法 + * 1.返回值相同 + * 2.参数相同 + * 3.降级方法名相同 + * @param id + * @return + */ + public User getByUserIdFallbackMethod(@PathVariable("id") Long id) { + return User.builder().username("-1").info("获取用户信息失败!").age(-1).build(); + } } diff --git a/spring-cloud-order-server/src/main/resources/application.yml b/spring-cloud-order-server/src/main/resources/application.yml index bbf5601ac7f0a8d2982c13b62232f1222fdd785b..3dbf27cd914b63ed7e3d4640790103788196fa17 100644 --- a/spring-cloud-order-server/src/main/resources/application.yml +++ b/spring-cloud-order-server/src/main/resources/application.yml @@ -10,4 +10,15 @@ spring: application: name: order-server server: - port: 1030 \ No newline at end of file + port: 1030 + +# ribbon调优配置 +#ribbon: +# ReadTimeout: 3000 #读取超时时间 +# ConnectTimeout: 3000 #链接超时时间 +# MaxAutoRetries: 1 #重试机制:同一台实例最大重试次数 +# MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数 +# OkToRetryOnAllOperations: false #是否所有操作都重试,因为针对post请求如果没做幂等处理可能会造成数据多次添加/修改 +# eager-load: +# enabled: true #开启饥饿加载 +# clients: user-server #针对于哪些服务需要饥饿加载 \ No newline at end of file diff --git a/spring-cloud-order-server/target/classes/application.yml b/spring-cloud-order-server/target/classes/application.yml index bbf5601ac7f0a8d2982c13b62232f1222fdd785b..3dbf27cd914b63ed7e3d4640790103788196fa17 100644 --- a/spring-cloud-order-server/target/classes/application.yml +++ b/spring-cloud-order-server/target/classes/application.yml @@ -10,4 +10,15 @@ spring: application: name: order-server server: - port: 1030 \ No newline at end of file + port: 1030 + +# ribbon调优配置 +#ribbon: +# ReadTimeout: 3000 #读取超时时间 +# ConnectTimeout: 3000 #链接超时时间 +# MaxAutoRetries: 1 #重试机制:同一台实例最大重试次数 +# MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数 +# OkToRetryOnAllOperations: false #是否所有操作都重试,因为针对post请求如果没做幂等处理可能会造成数据多次添加/修改 +# eager-load: +# enabled: true #开启饥饿加载 +# clients: user-server #针对于哪些服务需要饥饿加载 \ No newline at end of file diff --git a/spring-cloud-order-server/target/classes/cn/mobius/OrderServerApplication.class b/spring-cloud-order-server/target/classes/cn/mobius/OrderServerApplication.class index d24316cf506886d181edbf203c579e0552690c43..c2b72c4c596c6993287c9e8ca318cf83cb62d763 100644 Binary files a/spring-cloud-order-server/target/classes/cn/mobius/OrderServerApplication.class and b/spring-cloud-order-server/target/classes/cn/mobius/OrderServerApplication.class differ diff --git a/spring-cloud-order-server/target/classes/cn/mobius/controller/OrderCtrl.class b/spring-cloud-order-server/target/classes/cn/mobius/controller/OrderCtrl.class index 665365e43c128331fea346fb6e3044f941c01e01..6163cbaf0fa88ade826e3a1874bed5b1dae4bdea 100644 Binary files a/spring-cloud-order-server/target/classes/cn/mobius/controller/OrderCtrl.class and b/spring-cloud-order-server/target/classes/cn/mobius/controller/OrderCtrl.class differ diff --git a/spring-cloud-pay-server/pom.xml b/spring-cloud-pay-server/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..eaf7d15be6c18aa221ca5166ba6ab3ff5302fc28 --- /dev/null +++ b/spring-cloud-pay-server/pom.xml @@ -0,0 +1,38 @@ + + + + springcloud-parent + cn.mobius + 1.0-SNAPSHOT + + 4.0.0 + + spring-cloud-pay-server + spring-cloud-pay-server + + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + org.springframework.boot + spring-boot-starter-web + + + + cn.mobius + spring-cloud-common + 1.0-SNAPSHOT + + + \ No newline at end of file diff --git a/spring-cloud-pay-server/src/main/java/cn/mobius/PayServerApplication.java b/spring-cloud-pay-server/src/main/java/cn/mobius/PayServerApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..8e640ad7d63cf21e710c8d0b5171fa42c525ecd1 --- /dev/null +++ b/spring-cloud-pay-server/src/main/java/cn/mobius/PayServerApplication.java @@ -0,0 +1,15 @@ +package cn.mobius; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@SpringBootApplication +@EnableEurekaClient +@EnableFeignClients // 开启feign +public class PayServerApplication { + public static void main(String[] args) { + SpringApplication.run(PayServerApplication.class,args); + } +} diff --git a/spring-cloud-pay-server/src/main/java/cn/mobius/config/FeignConfiguration.java b/spring-cloud-pay-server/src/main/java/cn/mobius/config/FeignConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..4c023b69c245b86be320fafdec8d4078ba4eb674 --- /dev/null +++ b/spring-cloud-pay-server/src/main/java/cn/mobius/config/FeignConfiguration.java @@ -0,0 +1,16 @@ +package cn.mobius.config; + +import feign.Logger; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * feign日志配置 + */ +@Configuration +public class FeignConfiguration { + @Bean + Logger.Level feignLoggerLevel() { + return Logger.Level.FULL; //打印Feign的所有日志 + } +} diff --git a/spring-cloud-pay-server/src/main/java/cn/mobius/controller/PayController.java b/spring-cloud-pay-server/src/main/java/cn/mobius/controller/PayController.java new file mode 100644 index 0000000000000000000000000000000000000000..7ead6eb7e836d4d2e9000e63de0816eddd2af784 --- /dev/null +++ b/spring-cloud-pay-server/src/main/java/cn/mobius/controller/PayController.java @@ -0,0 +1,21 @@ +package cn.mobius.controller; + +import cn.mobius.fegin.UserFeignClient; +import domain.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/pay") +public class PayController { + + @Autowired + private UserFeignClient userFeignClient; + + @RequestMapping("/getUserById/{id}") + public User getUserById(@PathVariable Long id) { + return userFeignClient.getByUserId(id); + } +} diff --git a/spring-cloud-pay-server/src/main/java/cn/mobius/fallback/UserFeignClientFactory.java b/spring-cloud-pay-server/src/main/java/cn/mobius/fallback/UserFeignClientFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..c9bb4f85894e382e7136c7569eb4c5b696fc9633 --- /dev/null +++ b/spring-cloud-pay-server/src/main/java/cn/mobius/fallback/UserFeignClientFactory.java @@ -0,0 +1,21 @@ +package cn.mobius.fallback; + +import cn.mobius.fegin.UserFeignClient; +import domain.User; +import feign.hystrix.FallbackFactory; +import org.springframework.stereotype.Component; + +@Component +public class UserFeignClientFactory implements FallbackFactory { + @Override + public UserFeignClient create(Throwable throwable) { + return new UserFeignClient() { + @Override + public User getByUserId(Long id) { + // 日志 + throwable.printStackTrace(); + return User.builder().age(-1).username("-1").info("未找到用户信息!").build(); + } + }; + } +} diff --git a/spring-cloud-pay-server/src/main/java/cn/mobius/fallback/UserFeignClientFallback.java b/spring-cloud-pay-server/src/main/java/cn/mobius/fallback/UserFeignClientFallback.java new file mode 100644 index 0000000000000000000000000000000000000000..447eab4218162b6a0fe3b9f3088d2fdf0f269cbf --- /dev/null +++ b/spring-cloud-pay-server/src/main/java/cn/mobius/fallback/UserFeignClientFallback.java @@ -0,0 +1,24 @@ +package cn.mobius.fallback; + +import cn.mobius.fegin.UserFeignClient; +import domain.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + + +/** + * 处理托底数据 + */ +@Component // 交给spring管理 +public class UserFeignClientFallback implements UserFeignClient { + + // 日志打印器 + private Logger logger = LoggerFactory.getLogger(UserFeignClientFallback.class); + + @Override + public User getByUserId(Long id) { + logger.info("用户服务不可用"); + return User.builder().age(-1).username("-1").info("未找到用户信息!").build(); + } +} diff --git a/spring-cloud-pay-server/src/main/java/cn/mobius/fegin/UserFeignClient.java b/spring-cloud-pay-server/src/main/java/cn/mobius/fegin/UserFeignClient.java new file mode 100644 index 0000000000000000000000000000000000000000..f7a6ea319b2f66c6bdff3af23bb3573ed03e70e0 --- /dev/null +++ b/spring-cloud-pay-server/src/main/java/cn/mobius/fegin/UserFeignClient.java @@ -0,0 +1,33 @@ +package cn.mobius.fegin; + +import cn.mobius.fallback.UserFeignClientFactory; +import cn.mobius.fallback.UserFeignClientFallback; +import domain.User; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +/** + * feign的客户端接口 + * 用来调取微服务 + */ +@Component +//@FeignClient(value = "user-server",fallback = UserFeignClientFallback.class) // 调取那个服务 +@FeignClient(value = "user-server",fallbackFactory = UserFeignClientFactory.class) +public interface UserFeignClient { + + /** + * 调取服务中的那个方法/业务 + * 1.请求相同 + * 2.请求路径相同 + * 3.请求参数相同 + * 4.返回类型相同 + * 5.服务名相同 + * @param id + * @return + */ + @GetMapping("/user/getByUserId/{id}") + User getByUserId(@PathVariable Long id); + +} diff --git a/spring-cloud-pay-server/src/main/resources/application.yml b/spring-cloud-pay-server/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..21cc9920444163d8a42f9eafea7a6bfdd91e05ec --- /dev/null +++ b/spring-cloud-pay-server/src/main/resources/application.yml @@ -0,0 +1,34 @@ +#注册到EurekaServer +eureka: + client: + serviceUrl: + defaultZone: http://localhost:1010/eureka/ + instance: + prefer-ip-address: true #使用ip地址进行注册 + instance-id: pay-server:1040 #实例ID +spring: + application: + name: pay-server +server: + port: 1040 + +# feign的日志 +logging: + level: + cn.mobius.fegin.UserFeignClient: debug + +# 开启hystrix支持 +feign: + hystrix: + enabled: true #开启熔断支持 + +# ribbon调优配置 +#ribbon: +# ReadTimeout: 3000 #读取超时时间 +# ConnectTimeout: 3000 #链接超时时间 +# MaxAutoRetries: 1 #重试机制:同一台实例最大重试次数 +# MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数 +# OkToRetryOnAllOperations: false #是否所有操作都重试,因为针对post请求如果没做幂等处理可能会造成数据多次添加/修改 +# eager-load: +# enabled: true #开启饥饿加载 +# clients: user-server #针对于哪些服务需要饥饿加载 \ No newline at end of file diff --git a/spring-cloud-pay-server/target/classes/application.yml b/spring-cloud-pay-server/target/classes/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..21cc9920444163d8a42f9eafea7a6bfdd91e05ec --- /dev/null +++ b/spring-cloud-pay-server/target/classes/application.yml @@ -0,0 +1,34 @@ +#注册到EurekaServer +eureka: + client: + serviceUrl: + defaultZone: http://localhost:1010/eureka/ + instance: + prefer-ip-address: true #使用ip地址进行注册 + instance-id: pay-server:1040 #实例ID +spring: + application: + name: pay-server +server: + port: 1040 + +# feign的日志 +logging: + level: + cn.mobius.fegin.UserFeignClient: debug + +# 开启hystrix支持 +feign: + hystrix: + enabled: true #开启熔断支持 + +# ribbon调优配置 +#ribbon: +# ReadTimeout: 3000 #读取超时时间 +# ConnectTimeout: 3000 #链接超时时间 +# MaxAutoRetries: 1 #重试机制:同一台实例最大重试次数 +# MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数 +# OkToRetryOnAllOperations: false #是否所有操作都重试,因为针对post请求如果没做幂等处理可能会造成数据多次添加/修改 +# eager-load: +# enabled: true #开启饥饿加载 +# clients: user-server #针对于哪些服务需要饥饿加载 \ No newline at end of file diff --git a/spring-cloud-pay-server/target/classes/cn/mobius/PayServerApplication.class b/spring-cloud-pay-server/target/classes/cn/mobius/PayServerApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..cc0465ed335551eba95c783528d669837d58404a Binary files /dev/null and b/spring-cloud-pay-server/target/classes/cn/mobius/PayServerApplication.class differ diff --git a/spring-cloud-pay-server/target/classes/cn/mobius/config/FeignConfiguration.class b/spring-cloud-pay-server/target/classes/cn/mobius/config/FeignConfiguration.class new file mode 100644 index 0000000000000000000000000000000000000000..cf39b6d0b9c79ed304928b8f5450ec0d11db7727 Binary files /dev/null and b/spring-cloud-pay-server/target/classes/cn/mobius/config/FeignConfiguration.class differ diff --git a/spring-cloud-pay-server/target/classes/cn/mobius/controller/PayController.class b/spring-cloud-pay-server/target/classes/cn/mobius/controller/PayController.class new file mode 100644 index 0000000000000000000000000000000000000000..11d7b9fec094bde08d67bb12d1d106ece6e7b99f Binary files /dev/null and b/spring-cloud-pay-server/target/classes/cn/mobius/controller/PayController.class differ diff --git a/spring-cloud-pay-server/target/classes/cn/mobius/fallback/UserFeignClientFactory$1.class b/spring-cloud-pay-server/target/classes/cn/mobius/fallback/UserFeignClientFactory$1.class new file mode 100644 index 0000000000000000000000000000000000000000..e1b18682917150a363d33698bac52af65cdf8d94 Binary files /dev/null and b/spring-cloud-pay-server/target/classes/cn/mobius/fallback/UserFeignClientFactory$1.class differ diff --git a/spring-cloud-pay-server/target/classes/cn/mobius/fallback/UserFeignClientFactory.class b/spring-cloud-pay-server/target/classes/cn/mobius/fallback/UserFeignClientFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..950603aa2e473463f14ebecac698a412b9f62e73 Binary files /dev/null and b/spring-cloud-pay-server/target/classes/cn/mobius/fallback/UserFeignClientFactory.class differ diff --git a/spring-cloud-pay-server/target/classes/cn/mobius/fallback/UserFeignClientFallback.class b/spring-cloud-pay-server/target/classes/cn/mobius/fallback/UserFeignClientFallback.class new file mode 100644 index 0000000000000000000000000000000000000000..6a79a100f29144a993d407f66371ca391da80d95 Binary files /dev/null and b/spring-cloud-pay-server/target/classes/cn/mobius/fallback/UserFeignClientFallback.class differ diff --git a/spring-cloud-pay-server/target/classes/cn/mobius/fegin/UserFeignClient.class b/spring-cloud-pay-server/target/classes/cn/mobius/fegin/UserFeignClient.class new file mode 100644 index 0000000000000000000000000000000000000000..eac01ae129761932e50941d7eb5ea08938d74b7f Binary files /dev/null and b/spring-cloud-pay-server/target/classes/cn/mobius/fegin/UserFeignClient.class differ