SpringCloud 之玩转 Eureka

这是我参与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-urldefaultZone 的配置,一定要求以 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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享