Eureka概述和架构
Eureka
Spring Cloud Eureka 是Netflix 开发的注册发现组件,本身是一个基于 REST 的服务。提供注册与发现,同时还提供了负载均衡、故障转移等能力
Eureka3个角色
服务中心,服务提供者,服务消费者
Eureka Server:服务器端。它提供服务的注册和发现功能,即实现服务的治理。
Service Provider:服务提供者。它将自身服务注册到Eureka Server中,以便“服务消费者”能够通过服务器端提供的服务清单(注册服务列表)来调用它。
Service Consumer:服务消费者。它从 Eureka 获取“已注册的服务列表”,从而消费服务
springcloud架构
编辑
Eureka微服务信息完善
默认名
SpringCloud体系里服务实体向eureka注册时注册名默认是
IP名:应用名:应用端口名
Actuator依赖
<!-- actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
修改application.yml
eureka: instance: #根据需要自己起名字,SpringCloud体系里服务实体向eureka注册时注册名 instance-id: springcloud-dept-8001
Eureka服务自保与剔除
服务剔除与服务自保的选择
服务剔除/服务自保,注册中心在同一时刻,只能用一种
在实际应用里,并不是所有无心跳的服务都不可用,也许因为短暂的网络抖动等原因,导致服务节点与注册中心之间续约不上,但服务节点之间的调用还是属于可用状态,这时如果强行剔除服务节点,可能会造成大范围的业务停滞
服务剔除
服务剔除把服务节点果断剔除,即使你的续约请求晚了一步也毫不留情
服务自保(默认开启)
服务自保把当前所有节点保留
服务自保模式往往是为了应对短暂的网络环境问题,在理想情况下服务节点的续约成功率应该接近100%,如果突然发生网络问题,比如一部分机房无法连接到注册中心,这时候续约成功率有可能大幅降低。但考虑到Eureka采用客户端的服务发现模式,客户端手里有所有节点的地址,如果服务节点只是因为网络原因无法续约但其自身服务是可用的,那么客户端仍然可以成功发起调用请求。这样避免了被服务剔除给错杀
关闭服务自保【修改application.yml】
这是服务自保的总闸,以下配置将强制关闭服务自保,即便上面的自动开关被触发,也不能开启自保功能
# 参数来关闭保护机制,以确保注册中心可以将不可用的实例正确剔除,默认为true。
eureka.server.enable-self-preservation=false;
Eureka服务发现
服务发现接口
@Autowired private DiscoveryClient discoveryClient;
获取所有服务
@GetMapping("/discovery") public Object testDiscoveryClient(){ //获取所有服务列表清单 List<String> services = discoveryClient.getServices(); for (String service : services) { System.out.println(service); } return this.discoveryClient; }
获取服务生产者实例及信息
//服务生产者名字 String hostName="CLOUD-PAYMENT-PROVIDER"; //1.服务发信中获取所有服务生产者的实例 List<ServiceInstance> instances = discoveryClient.getInstances(hostName); //2.获取具体实例 服务生产者的实例 ServiceInstance serviceInstance = instances.get(0); System.out.println(serviceInstance.getUri()); System.out.println(serviceInstance.getPort()); System.out.println(serviceInstance.getHost()); System.out.println(serviceInstance.getServiceId()); System.out.println("=========================");
Eureka服务发现
RestTemplate
RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版:例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute
配置类
我们会将RestTemplate注入到容器当中,是为了让他保持单例,当我们哪个类要使用的时候直接从容器里面获取即可。这样可以避免每调用一次创建一个RestTemplate对象
/** * RestTemplate放入容器中 */ @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
@LoadBalanced(暂时不要用)
在配置类中的restTemplate添加@LoadBalanced注解
这个注解会 给这个组件 有负载均衡的功能
使用
@GetMapping("/index") public String index() { //服务生产者名字 String hostName ="CLOUD-PAYMENT-PROVIDER";//Application底下 //远程调用方法具体URL(接口路径) String url = "/payment/index"; //1.服务发信中获取所有服务生产者的实例 List<ServiceInstance> instances = discoveryClient.getInstances(hostName); //2.获取具体实例 服务生产者的实例 ServiceInstance serviceInstance = instances.get(0); //3.发起远程调用(url/接口方法返回类型) String rest = restTemplate.getForObject(serviceInstance.getUri()+url, String.class); return rest; }