Version: Next

集群Eureka构建

Eureka 集群原理

问题

微服务RPC远程服务调用最核心的什么?

  • 高可用:如果只有单点注册中心服务器,一旦宕机,则整个服务环境崩溃

解决:

  • 将注册中心集群化
  • 集群中的节点:相互注册:相互守望

新建 Eureka 集群节点

参照 cloud-eureka-server7001,建一个 cloud-eureka-server7002

  • pom:dependencies 直接复制 7001 的

修改映射文件:host文件,mac 系统为 /etc/hosts

  • 添加

    127.0.0.1 eureka7001.com
    127.0.0.1 eureka7002.com

修改 70017002 微服务的 application.yaml 内容

7001
server:
port: 7001
eureka:
instance:
# hostname: localhost #eureka服务端的实例名称
hostname: eureka7001.com # 集群环境下,在hosts文件配置了自己地址的名字
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
fetch-registry: false
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
# 单机
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群:使用定义在 hosts 里的名称,注册到对方节点
defaultZone: http://eureka7002.com:7002/eureka/
7002
server:
port: 7002
eureka:
instance:
# hostname: localhost #eureka服务端的实例名称
hostname: eureka7002.com # 集群环境下,在hosts文件配置了自己地址的名字
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
fetch-registry: false
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
# 单机
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群:使用定义在 hosts 里的名称,注册到对方节点
defaultZone: http://eureka7001.com:7001/eureka/
提示

如果使用更多节点,则在 defaultZone 位置,使用 , 将地址隔开

写主启动类,加上 @SpringBootApplication@EnableEurekaServer

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

测试

  • 依次启动 70017002 项目
  • 访问 localhost:7001localhost:7002,互相可以看到


支付服务注册到Eureka集群

修改 cloud-provider-payment8001application.yaml

  • defaultZone 部分,同时写上两个 Eureka 节点的地址即可
server:
port: 8081
spring:
application:
name: cloud-payment-service
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/springcloud?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true #驼峰映射
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #调试打印SQL
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
#集群版
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
#单机版 入驻到这个地址(就是注册中心地址)
# defaultZone: http://127.0.0.1:7001/eureka/

订单服务注册到Eureka集群

同理,修改YAML文件就可以,略

测试

  1. 启动 70017002
  2. 启动 cloud-provider-payment8001
  3. 启动 cloud-consumer-order80
  4. 访问 http://127.0.0.1:80/consumer/payment/get/4

能够看到正确的响应 JSON 即可