封装了Netfix公司的Eureka模块来实现服务治理
多个消费者与多个服务提供者之间的相互调用,需要一个管理机制
可以实现服务调用,负载均衡,容错等,实现服务发现与注册
微服务RPC远程服务调用最核心的是高可用
如果注册中心只有一个,如果出故障了,会导致整个服务环境不可用搭建Eureka注册中心集群,实现负载均衡+故障容错集群的原理
需要修改hosts文件
修改注册中心yml配置
注册中心需要相互注册 修改微服务的yml复制一个新的模块
改一下端口号即可
控制层改一下方便得知是调用的是哪个提供者模块
消费者模块配置类开启负载均衡机制
调用时地址不可写死
@LoadBalanced 注解
负载均衡效果达到,端口交替出现
主机名称:服务名称修改
yml文件中添加*
设置访问信息有IP提示
yml文件中添加即可
instance: instance-id: payment8002 prefer-ip-address: true # 访问路径可以显示IP地址宁可放过一个,绝不可错杀一千;使得Eureka集群更加健壮,稳定
在Eureka Client与Eureka Server网络不通的情况下,Eureka Server不会立刻将其踢出
自我保护机制默认开启
注册中心配置
server: # 关闭自我保护机制,保证不可用服务被及时踢出 enable-self-preservation: false # 间隔时间 eviction-interval-timer-in-ms: 2000提供者微服务配置
instance: instance-id: payment8001 prefer-ip-address: true # 访问路径可以显示IP地址 # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30) lease-expiration-duration-in-seconds: 1 # Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认90)超时踢出服务 lease-renewal-interval-in-seconds: 2如果提供者发送宕机,则注册中心立马踢出该提供者(灭绝师太模式)
依赖(注意依赖版本不要小于虚拟机或者服务器上的版本)
<!--SpringBoot整合Zookeeper客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> <exclusions> <!--先排除自带的zookeeper3.5.3--> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency> <!--添加zookeeper3.4.9版本--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.7</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>yml文件
server: port: 8004 spring: application: # 服务别名---注册zookeeper到注册中心的名称 name: cloud-provider-payment cloud: zookeeper: # 默认localhost:2181 connect-string: 121.19.209.178:2181主启动类(开启@EnableDiscoveryClient)
@SpringBootApplication @EnableDiscoveryClient // 该注解用于向使用consul或者zookeeper作为注册中心时注册服务 public class PaymentMain8004 { public static void main(String[] args) { SpringApplication.run(PaymentMain8004.class,args); } }控制层
@RestController public class PaymentController { @Value("${server.port}") private String serverPort; /** * http://localhost:8004/payment/zk * * @return */ @RequestMapping(value = "payment/zk") public String paymentZk() { return "SpringCloud with zookeeper:" + serverPort + "\t" + UUID.randomUUID().toString(); } }yml及pom文件与提供者大概一致
配置类
使用RestTemplate使用远程调用 @Configuration public class ApplicationContextBean { @Beanjava @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }控制层
@RestController @Slf4j public class OrderZkController { public static final String INVOKE_URL = "http://cloud-provider-payment"; @Resource private RestTemplate restTemplate; @GetMapping(value = "consumer/payment/zk") public String paymentInfo() { String result = restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class); return result; }java }是临时节点
当你服务停止之后,并不会立刻踢你,zookeeper会在一定时间范围里给你发心跳包,如果发着发着没有回音,则踢出
@GetMapping(value = “consumer/payment/zk”) public String paymentInfo() { String result = restTemplate.getForObject(INVOKE_URL + “/payment/zk”, String.class); return result; }java
}
是临时节点
当你服务停止之后,并不会立刻踢你,zookeeper会在一定时间范围里给你发心跳包,如果发着发着没有回音,则踢出
比Eureka更加干脆