eureka高可用和负载均衡
高可用:
配置eureka集群 两个主机
文件名为:application-eureka1.yml 和 application-eureka2.yml
后面的配置类在运行时会覆盖公共配置
# application-eureka1.yml
eureka:
instance:
# 主机名,集群中用主机名相互区分
hostname: eureka1
client:
# 针对单台服务器,不向自己注册,也不向自己拉取注册表
# true 表示允许
register-with-eureka: true
fetch-registry: true
# 1 连接 2
service-url:
defaultZone: http://eureka2:2002/eureka
# application-eureka2.yml
eureka:
instance:
# 主机名,集群中用主机名相互区分
hostname: eureka2
client:
# 针对单台服务器,不向自己注册,也不向自己拉取注册表
register-with-eureka: true
fetch-registry: true
# 2 连接 1
service-url:
defaultZone: http://eureka1:2001/eureka
配置两个主机,使他们互相连接,互相注册和拉取注册表,同时也拉取自己的注册表
配置相应的启动类
配置两个item-server商品服务,和相应的启动类
和相应的yml文件:用逗号分割多个eureka的链接地址
负载均衡:
由注解@LoadBalanced 对 RestTemplate 进行增强;
二:两个基本点
ribbon [ˈribən] 、hystrix
首先创建一个测试module sp6
sp6用于测试两个工具 ribbon、hystrix
主要依赖:Ribbon [Maintenance]
配置application.yml文件:
spring:
application:
name: ribbon
server:
port: 3001
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka
ribbon:
# 重试次数
MaxAutoRetries: 1
# 更换服务器次数
MaxAutoRetriesNextServer: 2
ribbon工具
RestTemplate远程调用工具
1.get请求方法:getForObject( url,xx.class,Prama);
url:请求的路径;
xx.class表示转化为xx对象类型;
Prama:表示请求的参数
eg:return restTemplate.getForObject(
“http://item-service/{1}”,
JsonResult.class,
orderId);
其中{1},{2},{3} 是RestTemplate提供的占位符格式,真实参数为后面的orderId即:url:“http://item-service/orderId”
2.post请求方式:postForObject(url, items,xx.class);
url:请求的路径;
items:请求体参数;
xx.class:表示转化为xx对象类型;
eg:return restTemplate.postForObject(
“http://item-service/decreaseNumber”,
items,
JsonResult.class);
**使用RestTemplate方法需要自己new一个对象
可以在启动类下边创建
@SpringBootApplication
public class Sp06RibbonApplication {
public static void main(String[] args) {
SpringApplication.run(Sp06RibbonApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
//实例化一个工厂对象 用于设置超时时间
SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
f.setReadTimeout(1000);
return new RestTemplate(f);
}
}
创建一个ribbon对象
@Autowired
private RestTemplate restTemplate;
@GetMapping("/item-service/{orderId}")
public JsonResult<List<Item>> getItems(@PathVariable String orderId){
// 调用远程02项目商品列表
// {1},{2},{3} 是RestTemplate提供的占位符格式 由orderId填充
// RestTemplate 必须给出具体服务器的地址,
// Ribbon 对 RestTemplate 进行了增强,提供负载均衡的功能
// 根据注册表注册的主机地址列表,做负载均衡访问
return restTemplate.getForObject(
"http://item-service/{1}",
JsonResult.class,
orderId);
}
@PostMapping("/item-service/decreaseNumber")
public JsonResult<?> decreaseNumber(@RequestBody List<Item> items){
return restTemplate.postForObject(
"http://item-service/decreaseNumber",
items,
JsonResult.class);
}
其中item-service为eureka注册id