接下来就是consul的使用,在使用上实际上和zookeeper并无什么差别
首先是服务提供者:
Pom
将zookeeper换掉:
Yml:
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
controller则单纯换下url,其他不变
然后是服务消费者:
同样和zookeeper一样,换掉zookeeper的依赖,小改一下url即可
启动两个模块,输入http://localhost:8500 可以看到两个模块都注册了进去
输入
http://localhost:8006/payment/consul
http://localhost/consumer/payment/consul
无异常即可通过
Zookeeper,consul,eureka的区别:
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
CAP原则的精髓就是要么AP,要么CP,要么AC,但是不存在CAP。
Eureka:AP
Zookeeper,Consul:CP
Ribbon负载均衡
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
Ribbon如今也处于维护模式
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
服务器端负载均衡
nginx 是客户端所有请求统一交给 nginx,由 nginx 进行实现负载均衡请求转发,属于服务器端负载均衡。既请求由 nginx 服务器端进行转发。
客户端负载均衡
Ribbon 是从注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现负载均衡策略。既在客户端实现负载均衡。
Ribbon工作时分成两步
- 比如对eureka,它会优先选同一个区域内负载较少的server
- 根据用户指定的策略选择一个服务使用
提供的策略有:轮询,随机和根据响应时间加权
尽管没有引入ribbon,但
已含有ribbon供用户使用
加ribbon的依赖也可以,不影响使用
加深对restTemplate的理解
GetForObject/getForEntity:
getForObject 返回值直接是响应体内容转为的 json 对象
getForEntity 返回值的封装包含有响应头, 响应状态码的 ResponseEntity 对象
修改cloud-consumer-order80srcmainjavacomxsspringcloudcontrollerPaymentController.java
将create方法修改成以下:
@GetMapping(value = "/consumer/payment/create")
public CommonResult create(Payment payment){
// return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);
return restTemplate.postForEntity(PAYMENT_URL+"/payment/create",payment,CommonResult.class).getBody();
}
读取http://localhost/consumer/payment/create 得到:
{"code":200,"message":"插入成功,端口号为:8001","data":1}
接着加入新的方法:
@GetMapping(value = "/consumer/payment/getForEntity/{id}")
public CommonResult
ResponseEntity
if(re.getStatusCode().is2xxSuccessful()){
return re.getBody();
}else {
return new CommonResult<>(444,"wrong");
}
}
输入网址:
http://localhost/consumer/payment/getForEntity/1 得到
{"code":200,"message":"查询成功,端口号为:8001","data":{"id":1,"serial":"alibaba"}}
Ribbon的负载均衡的规则
com.netflix.loadbalancer.RoundRobinRule 轮询
com.netflix.loadbalancer.RandomRule 随机
com.netflix.loadbalancer.RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
WeightResponseTimRule 对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
BestAvaliableRule 会像过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
AvaliabilityFilteringRule 先过滤掉故障实例,再选择并发较小的实例
ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能喝server的可用性选择服务器
默认使用轮询
如何修改默认规则?依然以cloud-consumer-order80为例
自定义配置类不能放在@ComponentScan所扫描的当前包下,然而@SpringBootApplication里包含了@ComponentScan,所以不能在com.xs.springcloud里配置
则创建一个新包裹,com.xs.myrule
创建一个新类:
@Configuration
public class MySelfRule {
@Bean
public IRule myRule(){
//定义为随机
return new RandomRule();
}
}
在主启动类加入以上注解:
@RibbonClient(name="CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
再做测试即可
以上为33-39集



