一、创建服务注册服务节点
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
启动服务注册配置
@EnableEurekaServer
application.yml
#单机版
#eureka:
# instance:
# hostname: localhost
# client:
# register-with-eureka: false #表示不向注册中心注册自己
# fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
# service-url:
# #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#集群版,服务中心需要相互注册
eureka:
instance:
hostname: eureka7001.com
client:
register-with-eureka: false #表示不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/
二、将服务注册到服务中心
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
服务客户端配置
@EnableEurekaClient
application.yml
eureka:
client:
register-with-eureka: true #是否向注册中心注册自己
fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
service-url:
# 设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
# defaultZone: http://localhost:7001/eureka #单机版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
instance:
instance-id: payment8001
prefer-ip-address: true #访问路径可以显示IP地址
# Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
# lease-renewal-interval-in-seconds: 1
# Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
# lease-expiration-duration-in-seconds: 2
三、注册中心的服务调用注册中心的服务
@Configuration
public class ApplicationContextConfig {
// 配置bean 不然后面没法依赖注入,就像以前ssm整合时配置依赖注入一样,
// 需要在配置文件配置之后,代码中才可以依赖注入
// 当前文件就是spring的配置文件
@Bean
@LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力 //将此注解注释掉,使用自己的轮询算法不使用默认的
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
import org.springframework.web.client.RestTemplate;
@Autowired
private RestTemplate restTemplate;
// private static final String PAYMENT_URL = "http://localhost:8001";
// CLOUD-PAYMENT-SERVICE 为注册中心的服务名称
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
@PostMapping("/payment/create")
public CommonResult<Payment> create(@RequestBody Payment payment) {
return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
}
四、服务发现
使用 org.springframework.cloud.client.discovery.DiscoveryClient 获取服务注册中心的服务信息
启动服务发现功能配置
@EnableDiscoveryClient
获取服务信息
@Resource
private DiscoveryClient discoveryClient;
/**
* 服务发现
* @return
*/
@GetMapping("discovery")
public Object discovery() {
List<String> services = discoveryClient.getServices();
for(String s : services)
log.info("services : {}", s);
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for(ServiceInstance serviceInstance : instances)
log.info("url : {}",serviceInstance.getUri());
return services;
}
五、Eureka的自我保护机制
如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。
保护机制主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。