Eureka服务注册与发现
Eureka与dubbo架构图的对比
Eureka服务的安装
-
单机
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
添加配置
eureka:
instance:
hostname: localhost #eureka服务端实例名称
client:
register-with-eureka: false #表示不向注册中心注册自己
fetch-registry: false #false表示自己就是注册中心,我的职责就是维护服务实例,并不区检索服务
service-url:
defaultZone: http://localhost:7001/eureka/
在启动类添加@EnableEurekaServer注解,这样相当于启动了一个服务的管理和注册中心。
接下来注册服务端
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
//启动类添加注解
@EnableEurekaClient
可以在管理中心(我们上一步搭建的)看到,一个服务上线了名称就是server.application.name。
接下来注册消端,引入相同的依赖,操作步骤和注册服务端相同。
- 集群
高可用,服务集群实现负载均衡
集群原理:两个服务管理中心:相互注册,相互守望
注册端配置换成集群的配置
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
消费断负载均衡
1 首先地址改为服务名称
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
2.给予resttemplate负载均衡的能力
@Configuration
public class ApplicationContext {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
访问服务可见它的地址在不停的变动,实现了负载均衡。
微服务信息完善:
配置之前
instance:
instance-id: payment8001
prefer-ip-address: true
配置主机名和显示ip
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置:
instance:
instance-id: payment8001
prefer-ip-address: true #显示ip
配置后:
鼠标移上去会显示ip地址
服务发现(获取服务的详细信息)
暴露自己的服务信息, 可以写一个接口来暴露自己的服务信息,相当于一个说明文档。
主启动类添加注解:@EnableDiscoveryClient
@Resource
private EurekaDiscoveryClient discoveryClient;
@GetMapping("/discovery")
public void discovery() {
List<String> services = discoveryClient.getServices();
for (String element : services) {
System.out.println("element:\t" + element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
System.out.println(instance.getServiceId() + "\t" + instance.getHost() + "\t" + instance.getPort() + "\t" + instance.getUri());
}
}
}
eureka自我保护机制
防止误删除(比如网络故障),某个服务不可用不会立即注销该服务。
禁用自我保护机制配置如下:
server:
eureka.instance.lease-expiration-duration-in-seconds=90 #上一次心跳等待时间,单位秒
eureka.instance.lease-renewal-interval-in-seconds=30 #每过多少次发送心跳
zookeeper代替eureka
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
配置
spring:
application:
name: cloud-provider-payment
cloud:
zookeeper:
connect-string: 192.168.1.25:2181
启动zookeeper,可以看到服务已经注册成功
注意:zookeepr的节点是临时性的,所以如果没收到心跳等待一定时间会被注销。
接下来是消费端的注册,步骤和服务端一样(不再重复)
消费端的调用
@RestController
public class OrderController {
private static final String INVOKE_URL = "http://cloud-provider-payment";
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/payment/zk")
public String get() {
String result = restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class);
return result;
}
}
Consul
它本质上和前面两种注册中心一样只是依赖和配置不一样
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: 192.168.28.130
port: 8500
discovery:
service-name: ${spring.application.name}
heartbeat:
enabled: true
以上部分图片和代码来源于尚硅谷视频教学