springcloud-2,注册中心eureka

概述

在之前的文章中, 我们发现了我们写死了获取服务的地址, 这样导致了如果我们修改了服务部署服务器, 以及部署多个避免单点故障的时候, 直接写死非常的不便。

由此, 我们需要一个来专门管理这些服务地址的工具, 那就是eureka, 实现了服务注册和状态监控等等。

现在有了3个角色:

  • eureka: 服务的注册, 提供服务的地址, 状态监控

  • 服务提供者: 向eureka注册自己的服务

  • 服务消费方: 向eureka获取想要的服务

搭建eureka-server服务

  • maven依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>
  • 启动器

注意要添加 @EnableEurekaServer的注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

  • 配置文件
server:
  port: 10086
spring:
  application:
    name: eureka-server-main
eureka:
  client:
    service-url:
      # eureka的服务地址,如果是集群的话,需要指定其他的集群eureka地址
      defaultZone: http://127.0.0.1:10086/eureka
    # 是否注册自己
    register-with-eureka: false
    # 不拉取服务
    fetch-registry: false
  • 启动运行

访问 http://127.0.0.1:10086/ 就能见到eureka的服务详情页面

改造user-service

  • 添加maven依赖
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 修改启动引导类

在启动引导类上添加 @EnableDiscoveryClient 注解

// 开启eureka客户端发现
@EnableDiscoveryClient
  • 修改配置文件
# 配置服务名
spring:
  application:
    name: user-service

# 配置eureka
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  • 启动注册

发现了服务已经注册到了eureka中了

DYhmE8.jpg

改造user-comsumer

  • maven依赖
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
 </dependency>
  • 配置启动引导类
// 开启eureka客户端发现
@EnableDiscoveryClient
  • 修改配置文件
# 配置服务名
spring:
  application:
    name: user-consumer

# 配置eureka
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  • 修改controller获取服务的方式

之前是直接写死的url地址

@Autowired
private RestTemplate restTemplate;

@Autowired
private DiscoveryClient discoveryClient;

@GetMapping("/{id}")
public User queryById(@PathVariable Integer id){
	ServiceInstance userService = discoveryClient.getInstances("user-service").get(0);
	User user = restTemplate.getForObject("http://"+userService.getHost()+":"+userService.getPort()+"/user/" + id, User.class);
	return user;
}
  • 启动测试

访问 http://127.0.0.1:8081/user/1

  • 访问报错

原因: DESKTOP-D0RE3JN:user-service:8080, 使用的是主机用户名, 我们更希望使用ip, 修改user-service 和user-consumer配置, 添加ip地址优先使用, 再次启动, ok

eureka:
  instance:
    prefer-ip-address: true

下面代码中此配置有点问题, 大家注意下, 配置成了(instance应该是在eureka下, 和client同一层, 下面是错误的)

eureka:

client:

​ instance:
​ prefer-ip-address: true

项目地址下载

eureka的高可用

启动多个eureka, 即使挂掉1台, 依然有可用的eureka, 那么就需要启动多台eureka ,并且他们能够同步注册过来的服务(即互相注册)

  • 配置文件
server:
  port: ${port:10086}
spring:
  application:
    name: eureka-server-main

# eureka单节点配置-*-*-*-start
#eureka:
#  client:
#    service-url:
#      # eureka的服务地址,如果是集群的话,需要指定其他的集群eureka地址
#      defaultZone: http://127.0.0.1:10086/eureka
#    # 是否注册自己
#    register-with-eureka: false
#    # 不拉取服务
#    fetch-registry: false
# eureka单节点配置-*-*-*-end

# eureka集群配置-*-*-*-start
eureka:
  client:
    service-url:
      # eureka的服务地址,如果是集群的话,需要指定其他的集群eureka地址
      defaultZone: ${defaultZone:http://127.0.0.1:10086/eureka}
    # 是否注册自己
    register-with-eureka: true
    # 不拉取服务
    fetch-registry: true
# eureka集群配配置-*-*-*-end
  • 根据不同参数启动多个
DYqgaR.png

第一台修改

DYqQ8f.png

第二台修改

DYqMPP.png

第一台运行会报错, 因为第二台还没有启动, 服务向第二台注册会失败, 启动是正常的。

uereka高可用源码下载

eureka的其他配置

配置eureka客户端user-service的注册、续约等配置项,配置eureka客户端user-consumer的获取服务间隔时间;了解失效剔除和自我保护

  • Eureka客户端工程

    • user-service 服务提供
      • 服务地址使用ip方式
      • 续约
    • consumer-demo 服务消费
      • 获取服务地址的频率
  • Eureka服务端工程 eureka-server

    • 失效剔除
    • 自我保护
  • user-service

# 配置eureka
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    # 配置ip
    ip-address: 127.0.0.1
    # 优先使用ip
    prefer-ip-address: true
    # 一旦超过多长时间, eureka认为服务已经移除或者失效, 默认: 90s
    lease-expiration-duration-in-seconds: 30
    # 服务的续约时间(多久续约一次) 默认:30s
    lease-renewal-interval-in-seconds: 10
  • user-comsumer
# 配置eureka
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
    # 拉取服务的时间间隔, 默认: 30s
    registry-fetch-interval-seconds: 10
  instance:
    prefer-ip-address: true
  • eureka-server

eureka出现红色告警, 是因为开启了自我保护, eureka不会应为服务突然失联而去提出服务, 而在实际中, 自我保护意义不大。

eureka:
  client:
    service-url:
      # eureka的服务地址,如果是集群的话,需要指定其他的集群eureka地址
      defaultZone: http://127.0.0.1:10086/eureka
    # 是否注册自己
    register-with-eureka: false
    # 不拉取服务
    fetch-registry: false
  server:
    # 服务失效剔除时间间隔, 默认60s
    eviction-interval-timer-in-ms: 10000
    # 关闭自我保护模式(默认:开启)
    enable-self-preservation: false

源码查看下载