SpringCloud探究Eureka构建微服务架构的高效服务发现系统
什么是Eureka?
Eureka是Netflix开源的一款用于构建弹性、高可用的服务发现系统的工具。在微服务架构中,服务数量庞大,每个服务可能会有多个实例。这时,需要一种机制来让服务能够自动地找到其他服务,以便进行通信。这就是服务发现的任务,而Eureka便是为此而生。
Eureka由两个主要组件组成:Eureka服务器和Eureka客户端。Eureka服务器负责维护所有服务的注册信息,而Eureka客户端则负责向Eureka服务器注册自己,并从服务器获取其他服务的信息,以便进行通信。
基础知识:
服务治理:springcloud封装了Netfix公司开发的Eureka模块来实现服务治理,在传统的pc远程调用框架中,管理每个服务与服务之间的依赖关系比较复杂,所以需要使用服务治理,管理服务之间的依赖关系,可以实现服务调用;负载均衡;容错;实现服务发现与注册。
服务注册与发现
Eureka采用了cs的架构设计,Eureka server作为服务注册功能的服务器,他是服务注册中心,而系统中的其他服务,使用Eureka的客户端连接到Eureka server 并维持心跳连接,这样系统的维护人员就可以通过Eureka server 来监控系统中各个微服务是否正常运行;
在微服务的注册与发现中,有一个注册中心,当服务启动的时候,会把当前自己服务的信息,比如服务地址,通信地址等以别名的方式注册到注册中心上,另一方(消费者服务提供者)以该别名的方式去注册中心上获取到实际的通信地址等信息,然后再实现本地rpc调用rpc远程调用框架核心设计思想,在注册中心,因为使用注册中心管理各个服务与服务之间的一个依赖关系(服务治理概念),在任何rpc框架中都会有一个注册中心(存放服务地址相关信息(接口地址))
- 简单理解就是外卖平台中的商家与客户在美团上注册了相应的账号 -
两个组件:
Eureka server提供注册:各个微服务节点通过配置启动后,会在Eureka server中进行注册,这样Eureka server 中的服务注册表中将会存储所有可能服务节点的信息,服务节点的信息可以在界面中看到。
Eureka Client通过注册中心进行访问
是一个Java客户端,用于简化Eureka server的交互,客户端同时也是具备一个内置的,使用轮训负载算法的负载均衡器。在应用启动后,将会向Eureka server发送心跳(默认30s)如果Eureka server 在多个心跳周期没有接受到某个节点的心跳。Eureka server会将其从服务注册表中将这个服务节点移除掉(默认90s)
Eureka实战:
单机Eureka构建步骤:
IDEA生成eurekaServer端服务注册中心类似美团平台
- 1.建module
cloud-eureka-server7001 - 改pom:引入Eureka的相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
12345
- 3.写yml
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己。
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1234567891011121314
- 主启动
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}
1234567
- 4.测试
http://localhost:7001/
1
- 5.将服务注册进Eureka成为提供者
dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
1234
- 6.改yml
server:
port: 80
spring:
application:
name: cloud-order-service
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
123456789101112131415
- 7.主启动
@SpringBootApplication
@EnableEurekaClient
public class MainApp80 {
public static void main(String[] args) {
SpringApplication.run(MainApp80.class, args);
}
}
1234567
- 8.注意事项:
集群Eureka构建步骤:
1.建module
参考cloud-eureka-server7001,新建cloud-eureka-server7002
2.改pom
3.改yml
为了区分Eureka,需要改配置文件
找到C:\Windows\System32\drivers\etc路径下的hosts文件,修改映射配置添加进hosts文件
- 127.0.0.1 eureka7001.com
- 127.0.0.1 eureka7002.com
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7002.com:7002/eureka/
1234567891011
7002中也将7001注册进去
4.主启动
package com.atguigu.springcloud;
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7002 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7002.class, args);
}
}
123456789
5.服务如集群
# 集群版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
12
负载均衡:
建立两个服务提供者,都注册进Eureka
在每个对应的controller中加入属性:
@Value("${server.port}")
private String serverPort;
12
///不要把地址写死
//public static final String PaymentSrv_URL = "http://localhost:8001";
// 通过在eureka上注册过的微服务名称调用
public static final String PAYMENT_SRV = "http://CLOUD-PAYMENT-SERVICE";
12345
7.配置一下负载均衡
使用 @LoadBalanced 注解赋予 RestTemplate 负载均衡的能力
package com.atguigu.springcloud.config;
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
123456789101112
actuator微服务信息完善:
主机名称:服务名称修改:
instance:
instance-id: payment8001
12
访问信息有IP信息提示:
prefer-ip-address: true #访问路径可以显示IP地址
1
服务发现Discovery:
对外暴露注册成功的微服务信息
修改Controller:
加上
@Resource
private DiscoveryClient discoveryClient;
@GetMapping(value = "/discovery")
public Object discovery() {
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("service:{}", service);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId() "\t" instance.getHost() "\t" instance.getPort() "\t"
instance.getUri());
}
return this.discoveryClient;
}
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient //服务发现
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}
12345678910111213141516171819202122232425
总结
通过Eureka,我们可以轻松地构建起一个弹性、高可用的服务发现系统,为微服务架构提供更好的通信机制。本文介绍了Eureka的基本概念以及如何通过示例代码来实现Eureka服务器和客户端。当然,Eureka还有更多高级特性和配置项可以探索,希望本文能够为您提供一个良好的起点。如果您正在考虑构建微服务架构,不妨考虑使用Eureka来实现服务发现的需求。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgajkfh
-
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24 -
微信小程序没声音怎么办
PHP中文网 06-15 -
微信提示登录环境异常是什么意思原因
PHP中文网 04-09 -
excel图片置于文字下方的方法
PHP中文网 06-27 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
使用云服务器搭建个人游戏加速器教程
AuroraJay 07-06 -
微信人名旁边有个图标有什么用
PHP中文网 03-11 -
Excel筛选和排序是灰色的怎么办
PHP中文网 06-22 -
抖音国际版要用什么加速器能流畅刷Tiktok的加速器
TK小达人 08-02 -
键盘上的负数是哪个键
PHP中文网 03-17