1.Eureka
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
2使用eureka步骤
1.搭建eureka server
1.1 创建一个工程,导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
1.2 导入相应坐标
1.3 配置application.yml
server:
port: 9000 #端口
#配置eureka server
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #是否将自己注册到注册中心
fetch-registry: false #是否从eureka中获取注册信息
service-url: #配置暴露给Eureka Client的请求地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1.4 配置启动类
@SpringBootApplication
//激活eurekaserver
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
2.将服务提供者注册到eurekaServer上
2.1 引入EurekaClient的坐标
<!--引入EurekaClient-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.2 修改application.yml添加EurekaServer的信息
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true #使用ip地址注册
2.3 修改启动类,添加服务发现的支持(可选)
@SpringBootApplication
@EntityScan("cn.itcast.product.entity")
//@EnableEurekaClient
//@EnableDiscoveryClient与上面那个用途一样
//新版本的springCloud中,在配置好配置中心之后,系统会自动把信息注册上去,这两个不写也可以
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class,args);
}
}
3.服务消费者通过注册中心获取服务列表并调用
//注入RestTemplate对象
@Autowired
private RestTemplate restTemplate;
/**
* 注入DiscoveryClient:
* springcloud提供的获取元数据的工具类
* 调用方法和获取服务的元数据信息
*/
@Autowired
private DiscoveryClient discoveryClient;
/**
* 参数:商品id
* 通过订单系统,调用商品服务,根据id查询商品信息
* 1.需要配置商品对象
* 2.需要调用商品服务
* 使用java中的urlconnection,httpclient,okhttp
*/
@RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable Long id){
//调用discoveryClient方法
//已调用服务名称获取所有的元数据
List<ServiceInstance>instances = discoveryClient.getInstances("service-product");
//获取唯一的一个元数据
ServiceInstance instance = instances.get(0);
//调用商品服务,根据元数据中的主机地址和端口号拼接请求微服务的URL
return restTemplate.getForObject("http://"+instance.getHost()+":"+instance.getPort()+"/product/1",Product.class);
}
3.EurekaServer的高可用
1.准备2个EurekaServer,需要互相注册
1号server:9000
2号server:8000
启动EurekaApplication然后立即停止,在Run Dashboard中改名字,并改属性
复制一份,然后改成对应项
Apply&&OK
然后在
这个下启动EurekaServer8000
再将9000改成8000启动EurekaServer9000
完成
2.需要将微服务注册到两个EurekaServer上
在需要注册Eureka的服务配置文件.yml中,将多个EurekaServer地址全部注入
3细节问题
1.在控制台显示服务IP
在服务提供者配置文件中,通过eureka.instance.instance-id配置控制台显示服务ip
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/,http://localhost:8000/eureka/ #多个EurekaServer之间用','隔开
instance:
prefer-ip-address: true #使用ip地址注册
instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心中注册服务
2.服务剔除问题
在服务的提供者,设置心跳间隔,设置续约到期时间
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/,http://localhost:8000/eureka/ #多个EurekaServer之间用','隔开
instance:
prefer-ip-address: true #使用ip地址注册
instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心中注册服务
lease-renewal-interval-in-seconds: 5 #向注册中心注册服务id
lease-expiration-duration-in-seconds: 10 #续约到期的时间
3.Eureka自我保护机制
在Eureka中配置关闭自我保护,设置剔除服务时间
#配置eureka server
eureka:
client:
register-with-eureka: false #是否将自己注册到注册中心
fetch-registry: false #是否从eureka中获取注册信息
#配置暴露给Eureka Client的请求地址
service-url:
defaultZone: http://127.0.0.1:9000/eureka/
server:
enable-self-preservation: false #关闭自我保护
eviction-interval-timer-in-ms: 4000 #设置剔除服务间隔