大家好,欢迎来到IT知识分享网。
Eureka学习
服务治理概念
在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错登,实现服务发现与注册!
Eureka的两个组件
Eureka Server
Eureka Server提供服务注册服务,各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可在界面中直观看到
Eruka Client
Eureka Client通过注册中心进行访问,他是一个java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器,在应用启动后,将会向Eureka Server发送心跳(默认周期30秒),如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)
Eureka运行原理
- 启动Eureka注册中心
- 启动服务提供者注册服务,会把自身的基本信息进行注册(服务名称会以配置文件中的spring.application.name注册)
- 启动消费者进行服务调用(使用服务别名去注册中心获取实际的RPC远程调用地址)
- 拿到远程调用地址后,底层通过HttpClient技术实现远程调用
- 消费者获得服务地址后会缓存在本地JVM中,默认每间隔30秒更新一次服务调用地址
Eureka Server实战配置
单机版环境搭建
服务端搭建
依赖添加
<!--Eureka Server依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
yml配置
server:
port: 7001
eureka:
instance:
hostname: 127.0.0.1 #eruka服务端实例的名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动访问
1、主启动类添加@EnableEurekaServer标识为Eureka Server端
2、启动成功后访问:http://127.0.0.1:7001/ 出现管理页面
注册服务者搭建(客户端)
依赖添加
<!--Eureka Client依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置yml
eureka:
client:
#true表示向注册中心注册服务
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
#设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
defaultZone: http://127.0.0.1:7001/eureka/
instance:
instance-id: payment8001 # 设置status中的名字
prefer-ip-address: true # 设置显示IP地址
启动测试
1、启动类添加注解@EnableEurekaClient
2、访问http://127.0.0.1:7001/ 到注册中心管理页面查看是否注册成功
3、注册成功后Instances currently registered with Eureka下:Application列会显示对应的服务名称
集群环境搭建
服务端搭建
修改映射配置host文件
C:\Windows\System32\drivers\etc hosts
#添加如下配置
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
互相注册、相互守望
eureka7001.com配置
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eruka服务端实例的名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/
eureka7002.com配置
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eruka服务端实例的名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/
启动后分别访问:http://eureka7002.com:7002/ ==== http://eureka7002.com:7001/
可以看到页面有DS Replicas标记为双方互为副本,相互注册,互相守望
注册服务者搭建(客户端)
注:基本和单节点配置一样,只需要关注service-url注册服务时,多个eureka已逗号隔开
server:
port: 80
spring:
application:
name: order-service
eureka:
client:
#true表示向注册中心注册服务
register-with-eureka: true
fetch-registry: true
service-url:
#设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
instance:
instance-id: payment8001 # 设置status中的名字
prefer-ip-address: true # 设置显示IP地址
服务提供者集群消费者调用
服务提供者集群
实现:功能一模一样,端口不一致
yml配置文件
server:
port: 8002
spring:
application:
name: payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mz-cloud-study?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: lwp123hh_QQ
# MyBatis配置
mybatis-plus:
# 搜索指定包别名
# typeAliasesPackage: com.lwp.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
# configLocation: classpath:mybatis/mybatis-config.xml
#代码生成
generator:
packagePath: com.lwp
entityPackName: entity
servicePackName: service
controllerPackName: controller
modulePath: provider-payment001
eureka:
client:
#true表示向注册中心注册服务
register-with-eureka: true
fetch-registry: true
service-url:
#设置Eureka Server交互的地址查询,服务查询和服务注册都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
instance:
instance-id: payment8002 # 设置status中的名字
prefer-ip-address: true # 设置显示IP地址
devtools:
restart:
enabled: true #是否支持热部署
不同点:server.port、eureka.instance.instance-id
代码区分具体服务提供者
//配置文件获取端口
@Value("${server.port}")
private String port;
@GetMapping("/list")
public AjaxResult list(){
return AjaxResult.success("当前提供服务端口为:"+port,paymentService.list());
}
消费者测试
RestTemplate开启负载均衡
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
请求服务提供者原固定地址修改为Eureka的服务名称
@Autowired
private RestTemplate restTemplate;
//原写死地址
// private String PAYMENT_URL = "http://127.0.0.1:8001/payment/";
//通过服务名称指定-->PAYMENT-SERVICE为Eureka中注册的服务名称
private String PAYMENT_URL = "http://PAYMENT-SERVICE/payment/";
@GetMapping("/list")
public AjaxResult list(){
ResponseEntity<AjaxResult> forEntity =
restTemplate.getForEntity(PAYMENT_URL + "list", AjaxResult.class);
return forEntity.getBody();
}
测试访问
输入:http://127.0.0.1/order/list 通过接口可以看出来,使用的负载轮询策略进行访问服务提供者的服务,结果如下:
{
"msg": "当前提供服务端口为:8002", //随着轮询策略变化
"code": 200,
"data": [
{
"id": "111",
"serial": "1234245345"
},
{
"id": "1421824275765010433",
"serial": "溪风测试"
}
]
}
Discovery服务发现
代码实现
1、启动类添加@EnableDiscoveryClient注解生效
2、使用DiscoveryClient获取相关信息,
注意:有两个包,一定要注意引入下面路径的包
import org.springframework.cloud.client.discovery.DiscoveryClient;
//获取服务基本信息的操作对象
@Autowired
private DiscoveryClient discoveryClient;
/**
* 获取所有的服务名称,并通过下标获取具体服务的详细信息
* @param index
* @return
*/
@GetMapping("/getDiscoveryInfo/{index}")
public AjaxResult getDiscoveryInfo(@PathVariable Integer index){
Map<String,Object> map = new HashMap<>();
//获取所有注册的实例
List<String> services = discoveryClient.getServices();
if(index>=services.size()){
return AjaxResult.error("没有该服务的注册信息");
}
for (int i = 0; i < services.size(); i++) {
map.put("ServiceName"+i,services.get(i));
}
//获取一个服务下的所有实例,比如集群多节点实例
List<ServiceInstance> serviceName0 = discoveryClient.getInstances(map.get("ServiceName"+index).toString());
List<Map<String,Object>> list = new ArrayList<>();
serviceName0.forEach( instance -> {
Map<String,Object> instanceMap = new HashMap<>();
instanceMap.put("instanceId",instance.getInstanceId());
instanceMap.put("host",instance.getHost());
instanceMap.put("port",instance.getPort());
instanceMap.put("uri",instance.getUri());
instanceMap.put("serviceId",instance.getServiceId());
instanceMap.put("scheme",instance.getScheme());
instanceMap.put("metadata",instance.getMetadata());
list.add(instanceMap);
});
map.put(map.get("ServiceName"+index)+"Info",list);
return AjaxResult.success(map);
}
测试效果
输入存在的下标,得出结果
{
"msg":"操作成功",
"code":200,
"data":{
"ServiceName1":"order-service",
"ServiceName0":"payment-service",
"payment-serviceInfo":[
{
"metadata":{
"management.port":"8001"
},
"instanceId":"payment8001",
"scheme":"http",
"port":8001,
"host":"169.254.118.211",
"serviceId":"PAYMENT-SERVICE",
"uri":"http://169.254.118.211:8001"
},
{
"metadata":{
"management.port":"8002"
},
"instanceId":"payment8002",
"scheme":"http",
"port":8002,
"host":"169.254.118.211",
"serviceId":"PAYMENT-SERVICE",
"uri":"http://169.254.118.211:8002"
}
]
}
}
输入不存在的下标,得出以下结果
{
"msg":"没有该服务的注册信息",
"code":200
}
Eureka自我保护
故障现象
说明:某时刻某个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存
设计思想:属于CAP理论中的AP分支
禁用自我保护
Eureka Server配置
eureka:
server:
#关闭自我保护机制,保证服务不可用及时被剔除,true为开启
enable-self-preservation: false
#逐出间隔计时器(毫秒),间隔多久剔除没有心跳响应的服务
eviction-interval-timer-in-ms: 15000
Eureka Client配置
eureka:
instance:
instance-id: order80 # 设置status中的名字
prefer-ip-address: true # 设置显示IP地址
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30秒)
lease-renewal-interval-in-seconds: 5
#Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认90秒),超时将被剔除
lease-expiration-duration-in-seconds: 10
学习代码demo
Eureka服务端
eureka-server
eureka-server-7002
Eureka客户端(注册服务者)
provider-payment001==》服务提供
provider-payment-8002==》服务提供
mz-order==》服务调用
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30694.html