SpringCloud学习-SpringCloudCommons
@EnableDiscoveryClient
Commons提供EnableDiscoveryClient
注释,通过META-INF/spring.factories
查找DiscoveryClient
接口的实现。Discovery Client的实现将在org.springframework.cloud.client.discovery.EnableDiscoveryClient
下面的spring.factories
中添加一个配置类。
默认情况下,DiscoveryClient
的实现将使用远程发现服务器自动注册本地SpringBoot服务器。可以通过在@EnableDiscoveryClient
中设置autoRegister=false
来禁用此功能
ServiceRegistry
Commons提供了一个ServiceRegistry
接口。它提供了诸如register
和deregister
之类的方法。允许提供定制的注册服务。Registration
是一个标记
@Configuration
@EnableDiscoveryClient(autoRegister=false)
public class MyConfiguration {
private ServiceRegistry registry;
public MyConfiguration(ServiceRegistry registry) {
this.registry = registry;
}
// 通过一些外部过程调用,例如事件或自定义执行器端点。
public void register() {
Registration registration = constructRegistration();
this.registry.register(registration);
}
}
每个ServiceRegistry
都有自己的Registry
实现
服务部门自动注册
默认情况下,ServiceRegistry
将自动注册正在运行的服务。要禁用该行为,有两种方法。可以设置@EnableDiscoveryClient(autoRegister=false)
永久禁用自动注册,也可以通过配置文件来配置spring.cloud.service-registry.auto-registration.enabled=false
禁用该行为
SpringRestTemplate作为负载均衡客户端
RestTemplate
可以自动配置为使用功能区。要创建负载均衡RestTemplate
创建RestTemplate
@Bean
并使用@LoadBalanced
限定符
@Configuration
public class MyConfiguration {
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
public class MyClass {
@Autowired
private RestTemplate restTemplate;
public String doOtherStuff() {
String results = restTemplate.getForObject("http://stores/stores", String.class);
return results;
}
}
URI需要使用虚拟主机名(服务名称,而不是主机名)。Ribbon客户端用户创建完整的物理地址
重试失败的请求
负载均衡RestTemplate
可以配置为重试失败的请求。默认情况下,该逻辑被禁用,可以通过配置来设置spring.cloud.loadbalancer.retry.enabled=false
。可以使用属性client.ribbon.MaxAutoRetries
, client.ribbon.MaxAutoRetriesNextServer
和 client.ribbon.OkToRetryOnAllOperations
多个RestTemplate对象
多个Bean,首先必须声明@Primary
注释,消除不合格的@Autowired
注入
@Configuration
public class MyConfiguration {
@LoadBalanced
@Bean
RestTemplate loadBalanced() {
return new RestTemplate();
}
@Primary
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
public class MyClass {
@Autowired
private RestTemplate restTemplate;
@Autowired
@LoadBalanced
private RestTemplate loadBalanced;
public String doOtherStuff() {
return loadBalanced.getForObject("http://stores/stores", String.class);
}
public String doStuff() {
return restTemplate.getForObject("http://example.com", String.class);
}
}
如果看到错误java.lang.IllegalArgumentException: Can not set org.springframework.web.client.RestTemplate field com.my.app.Foo.restTemplate to com.sun.proxy.$Proxy89
,需要尝试RestOperations
或者设置spring.aop.proxyTargetClass=true
忽略网络接口
有的时候,某些服务需要忽略,可以使用正则来配置。
application.yml
spring:
cloud:
inetuils:
preferedNetworks:
- 192.168
- 10.0
也可以强制使用本地地址
application.yml
spring:
cloud:
inetuils:
useOnlySiteLocalInterfaces:true