Eureka作为一个老牌经典的服务注册&发现技术,其设计和理念,也在影响后面的组件。目前主流的服务注册&发现的组件是Nacos
当前项目架构问题分析-引出Eureka
问题分析:
1.在企业级项目中,服务消费访问请求会存在高并发
2.如果只有一个会议中心-提供服务,可用性差
3.所以,会议中心提供服务往往是一个集群,也就是说会有多个会议中心-提供服务微服务模块
4.那么这个时候,就存在一个问题就是服务消费方,怎么去发现可以使用的服务
5.当服务消费方,发现了可以使用的服务后(可能是多个,又存在一个问题就是到底调用A服务,还是B服务的问题,这就引出了服务注册和负载均衡)
6.Eureka就可以解决上述问题
Eureka的使用
1.会员中心-提供服务的,在项目中,会做成集群,提供高可用
2.Eureka Server有必要的话,也可以做成集群
3.Eureka包含两个组件:reka Server和Eureka Client
4.Eureka Server提供注册服务,各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
5.EurekaClient通过注册中心进行访问,是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(roud-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
RPC: remote procedure call 远程(程序/过程)调用
服务注册与发现
Eureka采用了cS[client-server-java基础我们讲过一个多人聊天项目]的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心。
系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接,通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。
服务消费者或者服务提供者,以服务别名的方式去注册中心上获取到实际的服务提供者通讯地址,然后通过RPC调用服务
创建单机Eureka Server-注册中心
创建e-commerce-eureka-server-9001微服务模块【作为注册中心】
常规方式创建
修改e-commerce-eureka-server-9001的pom.xml,加入依赖
<dependencies>
<!--引入eureka-server场景启动器starter-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--使用版本仲裁.一个web服务,监听端口-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--说明:starter-actuator是springboot程序的监控系统,可实现系统的健康检测
可以通过http://localhost:9001/actuator看到相关的连接和信息-->
<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>
</dependency>
<dependency>
<groupId>com.stein.springcloud</groupId>
<artifactId>e-commerce-center-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
创建resources/application.yml
配置Eureka
注意这儿的defaultZone,之前漏写了。
server:
port: 9001
eureka:
instance:
hostname: localhost
client:
#不向注册中心注册自己
register-with-eureka: false
#表示自己就是注册中心,作用就是维护注册服务实例,不需要去检索服务
fetch-registry: false
service-url:
#设置与eureka server交互的模块,查询服务和注册服务都要依赖这个地址
#静态写法:http://localhost:9001/eureka/ 下面改成了动态写法,更灵活
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
创建主启动类com/hspedu/springcloud/EurekaApplication.java
注意使用该注解@EnableEurekaServer。启动后在浏览器输入localhost:9001即可查看页面
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
将member-service-provider-10000作为EurekaClient注册到e-commerce-eureka-server-9001成为服务提供者
1修改member-service-provider-10000的pom.xml
添加pom依赖
<!--引入Eureka-client 的starter,注意starter不要写漏了,很难排查:使用版本仲裁-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2修改member-service-provider-10000的resources/application.yml
新增到application.yml
eureka:
client:
register-with-eureka: true #将自己注册到eureka-server。默认ture
fetch-registry: true #从eureka-server抓取注册信息。便于集群配合Ribbon使用负载均衡。默认ture
service-url:
#表示将自己注册到哪个eureka-server
defaultZone: http://localhost:9001/eureka
# instance:
# hostname:这儿是client端,不需要使用别名
3修改member-service-provider-10000的com/hspedu/springcloud/MemberApplication.java
添加注解@EnableEurekaClient。(注意区分Server端和Client端)
4完成测试
启动e-commerce-eureka-server-9001
启动member-service-provider-10000
查看浏览器:http://localhost:9001
微服务注册名配置说明:在yml中配置的(已经配置过了)
spring:
application:
name: member-service-provider-10000 #配置应用的名称。可以自定义,这儿保持一致了
配置member-service-consumer-80作为EurekaClient可以拉取/获取e-commerce-eureka-server-9001提供的服务信息
1修改pom.xml
<!--引入eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2修改application.yml
本次测试省略了 register-with-eureka/fetch-registry。因为默认值是true,依然正常。
很容易理解,毕竟client>service的数量,所以默认设置client的配置比较节省代码。
eureka:
client:
service-url:
defaultZone: http://localhost:9001/eureka
3修改MemberConsumerApplication.jave
添加注解@EnableEurekaClient。(注意区分Server端和Client端)
4完成测试
启动e-commerce-eureka-server-9001
启动member-service-consumer-80
查看浏览器:http://localhost:9001。又多了一项
Eureka自我保护模式
通常为了健壮性,都不会禁用该模式。以下配置仅供参考,不常使用。
在服务端application.yml设置
eureka:
server: #禁用自我保护模式
enable-self-preservation: false
客户端application.yml设置
eureka:
instance:
#客户端向服务端发送心跳的时间间隔1s(默认是30s)
lease-renewal-interval-in-seconds: 1
#服务端最后一次收到心跳后的等待时间,超过将剔除服务(默认是90s)
lease-expiration-duration-in-seconds: 2
测试:
启动server
启动provider
在server可以查看到provider
然后停止provider
2s后即可发现server里面已不显示该provider