StringCloud 服务注册 Eureka

2021-04-11 23:48:47

Eureka 是微服务架构中的服务注册和发现工具,最初由 Netflix 公司开发,现已被集成到Spring Cloud全家桶。服务的注册和发现是微服务的起点,过去单独部署的服务有了集中的配置,为后续的服务间解耦和负载等提供了可能。


Eureka 管理服务主要通过两部分组成:Eureka Server(Eureka服务)和 Eureka Client(Eureka客户端),其中 Eureka Server 保存所有服务的信息,进行服务调用时可以通过Eureka Server 获取服务的具体地址信息,Eureka Client 一般是服务提供者或消费者,可以将本服务的地址信息注册到 Eureka Server,同时 Server 和 Client 保持一定间隔的心跳消息,用来检测 Client 是否可用。

Eureka Server

推荐使用 Idea 创建 SpringCloud 相关的项目,在向导中选中所需要的组件,特别是 Eureka Server 即可,通过向导会创建一个包含 @EnableEurekaServer 注解的 spring boot 模块,然后在配置文件中做基本的配置。
然后添加几项配置至配置文件就可以完成一个最基本的服务注册功能了。

#application.properties 文件

#本服务端口
server.port=8001
#服务名
spring.application.name=eureka-server
#如果可以在配置时确定主机名(否则将从 OS 原语猜测它)。
eureka.instance.hostname=localhost

# 指示此实例是否应向 eureka 服务器注册其信息以供其他人发现。 在某些情况下,您不希望您的实例被发现,而您只想发现其他实例。
eureka.client.register-with-eureka=false

# 指示此客户端是否应从 eureka 服务器获取 eureka 注册表信息。
eureka.client.fetch-registry=false

启动这个服务可以看到效果,在浏览器中访问:http://localhost:8001/。

安全

可以将服务注册在内网,能一定程度上避免恶意注册,但是更好的办法是加一个验证,推荐 spring-security。
使用 maven 添加依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

然后增加一个 spring-security 配置文件,并关闭 csrf

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}

然后在配置文件中设定账号信息

#application.properties 文件中增加以下两项

spring.security.user.name=admin
spring.security.user.password=admin

这时再启动 Eureka Server,使用浏览器打开时已经要求输入账号信息了,在 Eureka Client 中也需要指定对应的账号信息。

集群

Eureka Server 的集群是逻辑自洽的,多个 Server 节点以对方为服务进行配置,相互组合就开成了一个服务注册集群,与zookeeper理念不同的是每个 Server 可以尽可能的提供服务,容忍不一致性。这个策略更实用,相对来说数据需要强一致性,服务当然是尽能提供功能为主。

Eureka Client

使用 Idea 创建一个普通的 spring boot 模块,依赖项指定了 Eureka Client 之后会自动在 maven 中加载依赖包。
之后在配置文件中配置即可

#application.properties 文件
#向注册中心注册的名字
spring.application.name=eureka-provider
server.port=8002

# 服务地址
eureka.instance.hostname=localhost

#注册中心路径,表示我们向这个注册中心注册服务,如果向多个注册中心注册,用“,”进行分隔
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8001/eureka/
#如何指定了服务端的账号验证,需要使用以下格式
#eureka.client.serviceUrl.defaultZone=http://${user}:${password}@127.0.0.1:8001/eureka/

#可以定制节点显示的名称 springboot的parent包将maven中默认的${*}修改成了@*@
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:V@project.version@

# 心跳间隔5s,默认30s。每一个服务配置后,心跳间隔和心跳超时时间会被保存在server端,不同服务的心跳频率可能不同,server端会根据保存的配置来分别探活
eureka.instance.lease-renewal-interval-in-seconds=5
# 心跳超时时间10s,默认90s。从client端最后一次发出心跳后,达到这个时间没有再次发出心跳,表示服务不可用,将它的实例从注册中心移除
eureka.instance.lease-expiration-duration-in-seconds=10

# 表示是否将自己注册到EurekaServer 默认true
eureka.client.register-with-eureka=true

#访问路径显示ip地址
eureka.instance.prefer-ip-address=true

使用集群注册服务器,可以指定多个 eureka.client.serviceUrl.defaultZone 值,之间用逗号间隔。

Copyright tg-blog 京ICP备15066502号-2