一、简述
简单应用及问题整理。
版本:Dalston.SR5
不同版本差异描述
二、 简单server样例
案例采用maven工程。
父类pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/>
</parent>
子类pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
启动类
@EnableEurekaServer
@SpringBootApplication
public class App
{
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
启动有报错,不必理会。
三、服务注册与发现
1. 注册中心高可用
为了模拟高可用,在系统C:\Windows\System32\drivers\etc下hosts文件中添加:
127.0.0.1 eureka1
127.0.0.1 eureka2
两个中心相互注册(defaultZone),服务提供方注册到两个注册中心。
注册服务中心一:
application.yml
server:
port: 8001
eureka:
instance:
hostname: eureka1
lease-renewal-interval-in-seconds: 10 ##定义服务续约任务(心跳)的调用间隔,单位:秒
lease-expiration-duration-in-seconds: 120 ##定义服务失效的时间,单位:秒(该时段内未收到心跳则失效)
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka2:8002/eureka/ ##互相注册到对方--高可用服务发现
服务提供方(自己随便弄个controller即可):
application.yml
spring:
application:
name: producer-service
server:
context-path: /producer
port: 7001
eureka:
client:
service-url:
#高可用配置,服务提供方需配置所有注册服务中心,以逗号分隔。
defaultZone: http://eureka1:8001/eureka/,http://eureka2:8002/eureka/
启动类:
@EnableEurekaClient
@SpringBootApplication
public class Producer
{
public static void main(String[] args) {
SpringApplication.run(Producer.class, args);
}
}
运行结果:
停掉一个:
2. 添加消费者
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
启动类
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer
{
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Consumer.class, args);
}
}
c类
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/test", method = {RequestMethod.GET})
public String hello(){
ResponseEntity<String> reponse = restTemplate.getForEntity("http://producer-service/producer/hello", String.class);
return reponse.getBody();
}
配置
spring:
application:
name: consumer-service
server:
context-path: /consumer
port: 7002
eureka:
client:
service-url:
defaultZone: http://eureka1:8001/eureka/,http://eureka2:8002/eureka/
3. feign
修改消费者
启动类:
@EnableFeignClients
注解:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
@FeignClient("producer-service")
//@FeignClient(name="producer-service", fallback = FeignServiceHystrixFallback.class)
public interface FeignService {
@RequestMapping(value = "/hello", method = { RequestMethod.GET })
String hello();
}
c类
@Autowired
FeignService feignService;
@RequestMapping(value = "/test", method = { RequestMethod.GET })
public String test() {
return feignService.hello();
}
4. 重试机制
依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
配置
cloud:
loadbalancer:
retry:
enabled: true ##启用重试机制
producer-service:
ribbon:
OkToRetryOnAllOperations: true #是否对所有的请求都进行重试
MaxAutoRetriesNextServer: 1 # 重试时切换实例的次数
MaxAutoRetries: 5 #最大重试次数,在该次数内进行实例切换
启动类
@EnableRetry
@Bean
//通过prefix 指定配置所在位置,或者通过setConnectionRequestTimeout进行设置
public HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory(){
HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpComponentsClientHttpRequestFactory.setConnectionRequestTimeout(1000);
httpComponentsClientHttpRequestFactory.setConnectTimeout(1000);
httpComponentsClientHttpRequestFactory.setReadTimeout(3000);
return new HttpComponentsClientHttpRequestFactory();
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate(httpComponentsClientHttpRequestFactory());
}
再添加两个producer,各提供一个相同的服务,一个睡眠时间设置大于3s,一个正常访问,以此模拟重试场景。
5. 熔断
##断路器超时时间:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 10000
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
使用@HystrixCommand设置降级方法,忽略异常,时间设置等。
@HystrixCommand(fallbackMethod = "callHelloFailback")
public String callHello() {
return restTemplate.getForObject("http://producer-service/hello", String.class);
}
public String callHelloFailback(){
return "降级策略";
}
四、参考
参考资料:
springCloud资料1
Finchley 升级问题