赞
踩
RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系 (服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))
Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurakaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到
EurekaClient通过注册中心进行访问
是一个Java客户端,用于简化Euraka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Euraka Server发送心跳(默认周期30秒)。如果Euraka Server在多个心跳周期内没有接收到某个节点的心跳,EurakaServer将会从服务注册表中把这个服务节点移除(默认90秒)
单机Eureka构建步骤
IDEA生成eurakaServer端服务注册中心类似物业公司
建module
改POM
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-euraka-server</artifactId>
</dependency>
<dependencies> <!-- eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- 引入自定义的api通用包,可以使用Payment支付Entity --> <dependency> <groupId>org.example.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- boot web actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <!-- 图形监控--> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> </dependencies>
写YML
主启动
测试http://localhost:7001/
EurakaClient端cloud-provider-payment8001将注册进EurekaServer成为服务提供者provider
EurakaClient端cloud-consumer-order80将注册进EurakaServer成为服务消费者consumer
测试:
http://localhost/consumer/payment/get31
集群Eureka构建步骤
实质:存key服务,取value调用地址
1、先启动eureka注册中心
2、启动服务提供者payment支付服务
3、支付服务启动后会把自身信息(比如服务地址以别名方式注册进eureka)
4、消费者order服务在需要调用接口时,使用服务别名去注册中心获取实际的RPC远程调用地址
5、消费者获得调用地址后,底层实际是利用HttpClient技术实现远程调用
6、消费者获得服务地址后会缓存在本地jvm内存中,默认每间隔30秒更新一次服务调用地址
问题:微服务RPC远程服务调用最核心的是什么
高可用,若注册中心只有一个,会导致整个为服务环境不可用
解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
写YML(以前单机)
主启动
将支付服务8001微服务发布到上面2台Eureka集群配置中
将订单服务80微服务发布到上面2台Eureka集群配置中
测试01
支付服务提供者8001集群环境构建
负载均衡效果达到
8001/8002端口交替出现
Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务还具备负载均衡功能
actuator微服务信息完善
主机名称:服务名称修改
修改cloud-provider-payment8001
YML:修改部分
访问信息有IP显示
服务发现Discovery
对于注册进euraka里面的微服务,可以通过服务发现来获得该服务的信息
修改cloud-provider-payment8001的Controller
@GetMapping(value = "/payment/discovery")
public Object discovery() {
List<String> services = discoveryClient.getServices();
for (String element : services) {
log.info("******element:" + element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICES");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
8001主启动类 @EnableDiscoveryClient
自测http://localhost:8001/payment/discovery
eureka自我保护
如果在Eureka Server的首页看到以下这段信息,则说明Eureka进入了保护模式:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE
导致原因
怎么禁止自我保护
注册中心eurekaServer端7001
出厂默认,自我保护机制是开启的
使用eureka.server.enable-self-preservation=false
可以禁用自我保护模式
关闭效果
在eurekaServer端7001处设置关闭自我保护机制
生产客户端eurekaClient端8001
马上消失!!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。