本篇是结合上一篇代码进行修改学习 点击👍
上一篇学习了 Eureka的基本学习
Eureka Server
**和**Eureka Client
**(服务节点的信息可以在界面中直观的看到)
定期
**向Eureka Server发送心跳(默认周期为30秒)。 如果没有接收到某个节点的心跳,
EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
微服务在消费远程API时总是使用本地缓存中的数据。
因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用。
高可用
。一个Eureka注册中心
不幸发生了宕机。
这个时候就算, 某个Eureka Client 发生了更改/停止… 也会被其它注册中心管理记录…使应用**高可用
**相互注册
**的方式实现 集群 高可用部署 (上图:三个注册中心之间的集群操作…注册中心之间数据同步, 共同管理 provider 和 comsumer 一个挂了也不会影响操作..
**)**
为eureka-server2 为了方便操作之间copy
eureka-server2
**pom.xml
**中添加依赖~这个学过Maven的都清除不过多解释…**Maven主pom.xml
**
<!-- Maven父工程包含管理的子工程... -->
<modules>
<module>common_api</module>
<module>common_orderService</module>
<module>common_userService</module>
<module>eureka-server</module>
<module>eureka-server2</module> <!-- 手动添加刷新Maven以将copy的工程添加至项目中... -->
<module>import-demo</module>
</modules>
ok,到这里大致就又 搭建好了一个**注册中心了
**
接下来就是配置一下注册中心了…
eureka-server2 的.**yml
**
server:
port: 7002 #修改...注册中心的端口; (要知道端口是唯一的...)
spring:
application:
name: eureka-server #注册中心应用名称,这里不需要修改...
#配置注册中心....
eureka:
client:
service-url: #注册中心对外暴漏的注册地址... 逗号分隔,不要有空格!!
defaultZone: http://localhost:7002/eureka/,http://localhost:7001/eureka/
fetch-registry: false
register-with-eureka: false
eureka-server 的.**yml
**
server:
port: 7001 #注册中心的端口;
spring:
application:
name: eureka-server #注册中心应用名称,这里不需要修改...
#配置注册中心....
eureka:
client:
service-url: #注册中心对外暴漏的注册地址...
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
fetch-registry: false
register-with-eureka: false
启动eureka-server 注册中心
启动common_orderService 订单模块 | common_userService用户模块
启动eureka-server2 注册中心
关闭7001 注册中心,测试并不会影响使用…
注意:
一个注册中心宕机
而出异常!但并不会影响使用!
port
**外,基本一致的**注册中心
**.yml
**配置中两个注册中心相互依赖:
defaultZone: http://localhost:7002/eureka/,http://localhost:7001/eureka/在SpringBoot的自动化配置和@EnableXXX(功能性注解)中起到了**决定性的作用。
**
首先ImportSelector 是一个接口
作用:
public interface ImportSelector {
//实现接口需要重写方法, 返回值是一个数组... 存放 class类名的数据;
//在一个@Configuration类中使用@Import引入该接口的实现类;
//会将实现类,实现方法的返回值所有的 class名都定义为Bean...
String[] selectImports(AnnotationMetadata var1);
}
DeferredImportSelector 是 ImportSelector的子接口…
DeferredImportSelector.Java接口
public interface DeferredImportSelector extends ImportSelector {
....
}
查看:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class}) //进入AutoConfigurationImportSelector.class
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
进入——AutoConfigurationImportSelector.class
DeferredImportSelector作用:
DeferredImportSelector接口继承ImportSelector
比ImportSelector慢一定...
@Eablexx
启动注解:实现:@Eabelexxx启动类注解,当使用注解才可以在程序中使用这个类, 不@Eable启动则不能使用类即方法()...
定义Bean对象User.Java
public class User {
String name;
String age;
//省略get/set/toString....
}
定义配置类Configuration类UserConfig.Java
//类并没有通过@Configuration 声明一个配置类,但内部已经使用@Bean 进行加载注入;
public class UserConfig {
@Bean
public User createUser() {
User u = new User();
u.setName("张三");
u.setAge("12");
return u;
}
}
//虽然不会立刻加载至Spring容器中,但后面类通过 ImportSelector 来进行统一加载...
定义ImportSelectorUserImportSelector.Java
//UserImportSelector 实现 ImportSelector接口,重写方法...
public class UserImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{UserConfig.class.getName()}; //返回一个String数组,里存放着要加载的类名..
}
//方法返回值 字符数组[] 中存放着要通过 @import来加载实现的类...
}
自定义创建开启注解: EnableUser.Java
@Retention(RetentionPolicy.RUNTIME) //类加载时候完成类执行
@Documented
@Target(ElementType.TYPE)
//-------以上都是Java注解
@Import(UserImportSelector.class) //通过import(UserImportSelector.Class) 引入实现类..
public @interface EnableUser {
//使用 @interface 自定义一个注解: @EnableUser;
//它是一个绑定注解内部包含一个: @Import(UserImportSelector.class)
//使用 @EnableUser 就等于使用了 @Import(UserImportSelector.class)!!!
}
ok !.项目Maven发布:**install
**:内部包含清理 打包 部署 测试 编译…操作;
已经打好了 Jar包并发布至 Maven的本地仓库了…
那么现在直接:项目引用就可以使用注解了…
本人使用的是一个**注册中心
**反之不常用而且 订单
**和**用户模块中
**已经有了一个User类为了避免冲突方便测试…**
操作开始:
MyEurekaServer2 .Java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import org.springframework.context.ConfigurableApplicationContext;
import wsm.config.EnableUser; //这是刚才自定义的注解!!通过它就可以启动User类的加载了...
import wsm.entity.User;
@SpringBootApplication //而且要知道@SpringBootApplication注解下有一个@SpringBootConfiguration
@EnableEurekaServer //注解主程序开启 Eureka服务
@EnableUser //引入自定义的注解即可完成下面 User
public class MyEurekaServer2 {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MyEurekaServer2.class, args);
User u = (User) run.getBean("uu"); //根据 @Bean("uu") 以加载至Spring容器; 通过@EableUser实现!
System.out.println(u);
}
}
把@Eable注解注释掉,在运行就报错了!!这个注解真强!
这就相当于一个类的开关, 需要的时候打开,不用的时候关闭!
那么**@EnableEurekaServer
** 的自动装配大致如此… (后面单独抽出一篇来详解吧…过年更!)
在Euraka的GitHub上,宣布Eureka 2.x闭源。
近这意味着如果开发者继续使用作为 2.x 分支上现有工作repo 一部分发布的代码库和工件,则将自负风险。
唉,就比较可惜所以就需要找新的**注册中心
**
consul是近几年比较流行的服务发现工具,工作中用到,简单了解一下。
consul的三个主要应用场景:**服务发现
**、**服务隔离
**、**服务配置
**。
安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。
综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究
CAP
Consul强一致性(CP)
Eureka保证高可用
和 最终一致性(AP)SpringBoot内部集成Tomcat..
Consul则是go编写而成,安装启动即可 使用前启动一个
启动程序 consul.exe
Consistency
**、可用性**Availability
**、分区容错性**Partition tolerance
**集群注册中心环境下, 一个客户端服务发送更改, 注册到注册中心,
必须, 所有的注册中心同步了才能继续进行请求…最终一致性
注册中心中表现就是:集群注册中心环境下, 一个客户端服务发送更改, 注册到注册中心,
不是必须, 所有的注册中心同步了才能继续进行操作…它会继续当前的操作,后台默默的做同步操作p 就表示同步过程中的 网络通信协议...
什么是高可用?
上面说了需要一个客户端执行程序启动:**consul.exe
**
cmd下 指定 客户端执行程序目录下:
consul.exe agent -dev -client=0.0.0.0
本地启动访问:**localhost:8500
**
通过get请求到http://127.0.0.1:8500/v1/catalog/services
查看所有的服务列表
通过get请求到http://127.0.0.1:8500/v1/catalog/service/
服务名查看具体的服务详情
consul的基本使用
后续了解..
服务注册与发现 可以去百度一下这都是啥值...
通过postman发送put请求到 http://127.0.0.1:8500/v1/catalog/register
地址可以完成服务注册:
{
“Datacenter”: “dc1”,
“Node”: “node01”,
“Address”: “192.168.74.102”,
“Service”: {
“ID”:“mysql-01”,
“Service”: “mysql”,
“tags”: “master”,“v1”,
“Address”: “192.168.74.102”,
“Port”: 3306
}
随便找一个微服务模块进行修改, 首先将这个模块之前的 Eureka的配置全部注释掉!!
因为我们要使用 consul做**注册中心...
**
consul注册中心通过 应用程序**直接启动!!
**
将eureka的依赖**pom.xml
**和配置**.yml
**去掉, 使用**consul注册中心
**
添加SpringCloud提供的基于Consul的依赖**Pom.xml
**
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloudBJ</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>common_orderService</artifactId>
<!-- 关键!! -->
<dependencies>
<!-- common_orderService工程引入common_api -->
<dependency>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>common_api</artifactId>
</dependency>
<!-- 直接注释掉: Eureka-server服务依赖 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
<!-- </dependency>-->
<!-- 基于consul的服务注册篇~ -->
<!--SpringCloud提供的基于Consul的服务发现-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--actuator用于心跳检查-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
.yml
server:
port: 6001 #设置端口6001 当有多个微服务时候注意端口号可别冲突了..
spring:
application:
name: order-server #设置当然微服务名,后面的 注册/调用服务,都是根据这个来的;
#consul的相关配置;
cloud:
consul: #server.cloud中添加: consul的相关配置;
host: 127.0.0.1 #表示Consul的Server的请求地址
port: 8500 #表示Consul的Server的端口
discovery: #服务注册与发现的相关配置
register: true
instance-id: ${spring.application.name}-${server.port} #实例的唯一id (推荐必填,cloud官网推荐,为了保证生成唯一的id可以使用: ${spring.application.name}-${server.port}
service-name: ${spring.application.name}
port: ${server.port}
ip-address: ${spring.cloud.client.ip-address} #当前微服务的请求ip
prefer-ip-address: true #开启ip地址注册 就是展示ip
#原Eureka的注册服务配置...
#eureka:
# client:
# service-url:
# defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/ #指定服务注册的注册中心;
# instance:
# prefer-ip-address: true #在Eureka上显示ip号..
# instance-id: ${spring.cloud.client.ip-address}:${server.port} #在Eureka上显示ip号..
# lease-renewal-interval-in-seconds: 5 #客户端向注册中心发送心跳时间
# lease-expiration-duration-in-seconds: 10 #如果没有发送心跳的延迟续约时间...
Service/Client
consul注册中心将 common_orderService订单模块**主程序注解修改
**
MyOrderServer.Java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
//import org.springframework.cloud.netflix.eureka.EnableEurekaClient; //注释 Eureka的引用
@SpringBootApplication
//@EnableEurekaClient //Eureka专用注解启动 客户端注册~
@EnableDiscoveryClient //通用注册中心注解~
public class MyOrderServer {
public static void main(String[] args) {
SpringApplication.run(MyOrderServer.class, args);
}
}
Eureka专用注册注解
** 更换为 @EnableDiscoveryClient 通用注册中心注解
别忘了启动Consul客户端
** 不然会报错!启动不起来~将其它的注册中心代码清理干净
Consul
**注册中心**pom.xml
.yml
文件@EnableDiscoveryClient
刷新 页面,可以看到微服务以 注册至Consul
客户端
负载均衡学习前先将上面的 cousul注册中心切换为 Eureka注册中心来讲解: Eureka内部集成Reibbon
负载均衡
是一种计算机技术
**是客户端的负载均衡,不是服务器端。
由于Eureka内部集成了Ribbon所以无需额外的依赖加载。
在创建RestTemplate的时候,声明@LoadBalanced
不需要拼接微服务的URL
,以待请求的服务名替换IP地址!!提供者provide 两个一模一样的订单模块做**负载均衡~
**
和上面两个注册中心一样~
修改端口号
**~虽然服务功能相同但是, port端口可是唯一的~**
common_orderService1 6001
common_orderService2 6003 6002被用户模块用了...
ok,两个几乎一模一样的订单模块搞完了之后**(模块名和端口不一样)
**…
为了区分可以这样~↓↓
两个订单模块都要修改**代码都是一样的~
**,**这里就展示一个了~
**
展示:common_orderService
OrderService.Java
@Service
public class OrderService {
//模拟假订单集合...
private static List<Order> orders = new ArrayList<>();
//类加载时候默认获取一些数据..模拟假订单..
static {
orders.add(new Order(1, "订单11", 10.0, 1));
orders.add(new Order(2, "订单21", 10.0, 2));
orders.add(new Order(3, "订单31", 10.0, 1));
orders.add(new Order(4, "订单41", 10.0, 2));
}
//获取主机号ip post------------------------------------------------------------------负载均衡~
//@Value("可以通过${} 来获取 属性文件中的值..并赋值到对象上~")
@Value("${spring.cloud.client.ip-address}")
private String ip;
@Value("${server.port}")
private String post;
//根据输入用户id获取当然用订单集合..
public List<Order> findOrderByUser(Integer uid) {
//为了区分负载均衡的调用~打印 ip 和 post----------------------------------------------负载均衡~
System.out.println(ip+":"+post);
List<Order> myorders = new ArrayList<>();
//遍历集合从中获取 uid一致的数据存放在集合中返回...
for (Order order : orders) {
if (order.getUid() == uid) {
myorders.add(order);
}
}
return myorders;
}
}
RestTemplate
负载均衡是配置在调用者的对RestTemplate类的实例添加 @LoadBalanced
MyUserServer.Java
@SpringBootApplication
@EnableEurekaClient
public class MyUserServer {
public static void main(String[] args) {
SpringApplication.run(MyUserServer.class, args);
}
@LoadBalanced //给RestTemplate类加上 @LoadBalanced 注解,及通过给RestTemplate来调用服务默认采用------负载均衡来使用!
@Bean
//实例化 RestTemplate 方便Service
//可别忘了@SpringBootApplication复合注解底层可以有@SpringBootConfiguration 它也是一个Spring的配置类!
public RestTemplate createRestTemplate() {
return new RestTemplate();
}
}
RestTemplate
的调用方式UserService.Java
** 17 ~ 18行的负载均衡调用方式~**
@Service
@Slf4j //加载lo4g使用...
public class UserService {
@Autowired
private RestTemplate restTemplate;
//通过restTemplate进行网络通信,返回..其它远程模块的数据(虽然现在都是本地的不过就是模拟了..)
@Autowired //实现动态调用...
private DiscoveryClient discoveryClient;
public List<Order> currentUserOrder(Integer uid) {
//获取注册中心上的微服模块实例 根据服务名;
//返回一个集合: 有可能这个服务在多个注册中心上存在,`负载均衡~` 所以是一个集合;
List<ServiceInstance> instances = discoveryClient.getInstances("order-server");
ServiceInstance serviceInstance = instances.get(0); //而本次只有一个...
log.info("用户服务调用订单服务");
//ribbon的负载均衡调用-----------------------------------------------------------------
//应为你现在已经有两个相同的 order-server 的微服务了,还使用ip+端口是固定的了,要通过负载均衡来完成动态调用~所以直接使用模块服务名来表示微服!
String myurl = "http://order-server/findOrderByUser/" + uid;
//动态调用服务 服务的host 服务端口号 这个就是服务controller请求 给其参数uid
//String myurl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/findOrderByUser/" + uid;
log.info(myurl);
List<Order> list = restTemplate.getForObject(myurl, List.class);
return list;
}
}
连续刷新用户模块查看 订单模块被调用的结果…**分布被调用了三次
**
负载均衡 默认采用:**轮循负载均衡..及轮流一人跑一次...
**
Consumer
**调用方**
实现对相同 服务名功能模块的, 负载均衡调用~http://服务名/请求名/{参数}/{参..}
形式进行 负载均衡调用;对负载均衡的相关配置,默认使用**轮询
**
前缀:com.netflix.loadbalancer.
.yml
在调用者模块下配置 负载均衡调用的方式:**那么就是在用户模块下配置订单模块的负载均衡配置
**
order-server: #这里的order-server是我服务的名称...目前的我的订单模块~
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改负载均衡的策略 随机方法服务
因为是服务的名称并没有代码提醒:**建议之间copy
**
当负载均衡的模块中一个 宕机了,Ribbon检测到并尝试重启服务
如果服务, 实在起不来了…就不在重试~
调用者
** 模块声明的 User用户模块pom.xml
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
.yml
order-server:
ribbon:
ConnectTimeout: 250 #连接超时时间
ReadTimeout: 1000 #数据读取超时时间
OkToRetryOnAllOperations: true #是否对所有操作进行重试
MaxAutoRetries: 1 #对当前实例的重试次数
MaxAutoRetriesNextServer: 1 #切换实例的重试次数
目前为止我们已经了解了SpringBoot的三种微服务调用方式:
Consumer——调用——Provide三种方式:
根据模块服务名返回一个模块集合
ServiceInstance serviceInstance = instances.get(0); 获取某一个模块;
//动态调用服务
String myurl = “http://” + serviceInstance.getHost() + “:” + serviceInstance.getPort() + “/请求名/” + 参数~;
serviceInstance.getHost() 服务的host
serviceInstance.getPort() 服务端口号
…String myurl = "http://多个的提供者provide模块/请求名/"
根据不同工作需求,采用不同的服务调用方式…下面介绍 Fegin的方式
面向接口开发~
Feign是Netflflix开发的声明式**模板化的HTTP客户端
**
Ribbon
和Eureka
, 从而让Feign的使用更加方便。在Eureka中Consumer还可以像方法调用一样调用Provider的接口
非常容易,也非常快速。可以有效的减少代码量。实现采用fegin的调用方式,调用 订单模块(provide)
fegin
依赖组件:pom.xmlpom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloudBJ</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>common_userService_fegin</artifactId>
<dependencies>
<!-- Maven子工程api实体 -->
<dependency>
<artifactId>common-api</artifactId>
<groupId>com.zb</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Eureka依赖~ -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- fegin依赖!! -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
fegin
的 .yam 配置这里的配置就很正常~**端口
** 服务名
Eureka配置中心管理...
为了防止出错就copy了,上面已经有很多重复的东西了…
application.yml
server:
port: 6004 #更改端口 6004
spring:
application:
name: user-server—fegin #设置当然微服务名,后面的 注册/调用服务,都是根据这个来的;
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${server.port} #在Eureka上显示ip号..
如果某个服务起不起来. 就先排查端口问题~
通过@EnableFeignClients注解开启Spring Cloud Feign的支持功能
MyUserFeginServer.java
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 MyUserFeginServer {
public static void main(String[] args) {
SpringApplication.run(MyUserFeginServer.class, args);
}
}
基于面向接口编程…
创建一个接口,此接口是在Feign中调用微服务的核心接口
@FeignClient("指定需要调用的微服务提供者 服务名称")
fegin就会底层自动进行匹配映射调用~
OrderFeginClient.Java
import com.zb.entity.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
//@FeignClient指定需要调用的微服务名称
@FeignClient("order-server")
public interface OrderFeginClient {
//调用的请求路径,要注意这里尽量要和 提供者的实现方法一模一样包括参数,参数类型!!
@GetMapping("/findOrderByUser/{uid}")
public List<Order> findOrderByUser(@PathVariable("uid") Integer uid);
}
UserService.Java
import com.wsm.client.OrderFeginClient;
import com.zb.entity.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private OrderFeginClient ofc; //获取接口对象,@feginClient 会自动将类注入Spring
public List<Order> currentUserOrder(Integer uid){
return ofc.findOrderByUser(uid); //调用接口的方法,fegin底层会默认调用,对于服务的方法...
}
}
UserController.Java
不详细解释了…
@RestController
public class UserController {
@Autowired
private UserService us;
@GetMapping("/showUserOrder")
public List<Order> showUserOrder(Integer uid){
return us.currentUserOrder(uid);
}
}
ok, 实现调用!
@EnableFeignClients
**启动类添加Feign的支持类上声明@FeignClient("指定提供者模块名")
并且:接口中方法,注意⚠️:要与Provider提供者的控制器一致!!
注解 参数 参数类型!Feign中本身已经集成了Ribbon依赖和自动配置
负载均衡~
默认论循~对于电脑性能较慢的朋友, Fegin默认调用时间 2秒;
如果超时了就不会在执行请求…为了解决这个问题 延长请求响应时间:
.yml
设置超时时间默认 10s
feign:
httpclient:
connection-timeout: 10000
client:
config:
default: # 指定feignclients对应的名称 如果指定的是default 表示全局所有的client 的超时时间设置
connectTimeout: 10000
readTimeout: 10000
loggerLevel: basic
对于Fegin 的接口上需要 @FeignClient("指定提供者模块名")
指定调用模块
如果多次接口上使用同一个 @FeginClient("多个接口声明相同模块名")
模块. 会报错:
.yml
需要把 spring.main.allow-bean-definition-overriding属性设置为 true
spring:
main:
allow-bean-definition-overriding: true
可以避免这个问题!!