这是我参与8月更文挑战的第 25 天,活动详情查看:8月更文挑战
版本,环境等信息
springboot:2.5.2
springcloud:2020.0.3
jdk: 1.8
maven: 3.5.9
搭建 eureka 服务端
创建 springboot 项目,命名 eureka-server
pom.xml 引入 eureka-server: spring-cloud-starter-netflix-eureka-server
在启动类加上注解 @EnableEurekaServer
,表示声明这个应用作为 eureka 的服务端,也就是注册中心
在 yaml 文件里配置 eureka 相关
# application.yml
spring:
application:
name: eureka-server
server:
port: 8100
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
# 禁止检索服务
fetch-registry: false
# 不向注册中心注册自己
register-with-eureka: false
复制代码
搭建 eureka 客户端(服务提供,生产者)
创建 springboot 项目,命名 eureka-client-provider
pom.xml 引入 eureka-client: spring-cloud-starter-netflix-eureka-client
pom.xml 中要求必须引入 spring-boot-starter-web
,否则会报错,别问为啥,问就是这坑我踩过了 ╥﹏╥…
在启动类添加服务发现的注解 @EnableDiscoveryClient
在 yaml 配置客户端相关属性
# application.yml
spring:
application:
name: eureka-client-provider
server:
port: 8300
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
instance:
# 采用 ip注册
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
复制代码
注意点 1
大部分资料使用 properties 格式进行编写
其中所使用的一个配置项
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
,对应的 yml 中service-url
是 map 结构,需要添加一个 key 为 defaultZone 的属性值
注意点 2
service-url 中 defaultZone 的配置,一定要求以 eureka 结尾,具体原因还未在源码里发现,源码中的默认
defaultZone = "http://localhost:8761/eureka/"
源码见下:
// EurekaClientConfigBean.class
public static final String DEFAULT_URL = "http://localhost:8761" + DEFAULT_PREFIX + "/"; // line: 55
// EurekaConstants.class
public static final String DEFAULT_PREFIX = "/eureka"; // line: 29
复制代码
搭建 eureka 客户端(服务消费,消费者)
创建 springboot 项目,命名 eureka-client-consumer
复制上一步的客户端,修改 ip 和 application-name
使用 RestTemplate 进行 http 访问,请求服务提供,其中 url 部分使用了服务提供者向 eureka 注册使用的服务名
@GetMapping("/call")
public String hello() {
return restTemplate.getForObject("http://eureka-client-provider/user/hello", String.class);
}
复制代码
对 RestTemplate 使用请求均衡策略
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
复制代码
注意 这样用到的负载均衡是org.springframework.cloud.client.loadbalancer.LoadBalanced
,和 Ribbon,Feign 毫无关系
注册中心开启密码验证
eureka 的服务端和客户端,都需要引入 spring-security 包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
复制代码
eureka-server
项目配置
添加配置数据
# application.yml
spring:
security:
user:
name: admin
password: admin
复制代码
增加 security 配置类
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 关闭csrf
http.csrf().disable();
// 支持httpBasic
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
复制代码
注意:
-
开启安全验证后,登陆 eureka 的注册中心就需要使用账号密码
-
eureka 客户端中的注册配置也需要带上验证配置
eureka-client-xx
项目配置
eureka:
client:
service-url:
# 如果 eureka server 开启密码验证,则客户端的 URL 连接需要带上校验信息
defaultZone: http://admin:admin@localhost:8100/eureka
复制代码
安全验证数据抽出变量优化
# application.yml
security:
uname: admin
pwd: admin
eureka:
client:
service-url:
# 如果 eureka server 开启密码验证,则客户端的 URL 连接需要带上校验信息
defaultZone: http://${security.uname}:${security.pwd}@localhost:8100/eureka
复制代码
抽出到配置文件
或者是,将这个配置放到application-security.yml
,然后,我们通过配置文件引入的方式
# application-security.yml
security:
uname: admin
pwd: admin
复制代码
# application.yml
spring:
profiles:
include:
- security
# 。。。。
复制代码
eureka 注册中心集群搭建
启动多个服务端,服务端之间相互注册
简易的方式就是通过启用不同的配置文件来启动多个不同端口的 eureka 注册中心
服务端配置文件修改
# appliction-master.yml
server:
port: 8101
eureka:
client:
service-url:
# 向 slave 注册
defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@localhost:8102/eureka
复制代码
#application-slave.yml
server:
port: 8102
eureka:
client:
service-url:
# 向 master 注册
defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@localhost:8102/eureka
复制代码
客户端配置文件修改
修改 eureka 客户端,添加多个服务端的 url,字符串形式,用 ,
分割
eureka:
client:
service-url:
# 如果 eureka server 开启密码验证,则客户端的 URL 连接需要带上校验信息
defaultZone:
http://${security.uname}:${security.pwd}@localhost:8101/eureka,
http://${security.uname}:${security.pwd}@localhost:8102/eureka
复制代码
eureka 的自我保护模式和 InstanceID 配置
关闭自我保护
# eureka-server 添加配置
eureka:
server:
# 关闭自动保护模式
enable-self-preservation: false
复制代码
修改实例注册时使用的 instanceID
# 客户端添加 instance 相关的配置
eureka:
instance:
# 采用 ip注册
prefer-ip-address: true
# 修改示例注册时显示的名字
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
复制代码
eureka 开发时快速移除失效服务
仅限开发使用
server 端配置
eureka:
server:
# 关闭自动保护模式
enable-self-preservation: false
# 清理间隔,default 60s
eviction-interval-timer-in-ms: 5000
复制代码
客户端配置
需要引入 spring-boot-starter-actuator
eureka:
client:
healthcheck:
enabled: true
instance:
# 心跳发送频率,default 30s
lease-renewal-interval-in-seconds: 5
# 心跳超时时间,default 30s
lease-expiration-duration-in-seconds: 5
复制代码
更多的 Instance 配置信息可参考源码中的配置类:org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean
更多的 Server 配置信息可参考源码中的配置类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean