Skip to main content

注册中心

当远程连接的微服务对象是集群时,不能根据固定的ip及端口调用

注册中心原理

  1. 服务提供商向注册中心注册服务信息

  2. 服务调用者向注册中心订阅对应的服务提供商注册的信息

  3. 服务调用者进行负载均衡(通过负载均衡的算法(轮询,加权轮询,随机等),选择其中的一个实例

  4. 服务调用者远程调用对应的实例

注:如果服务提供商信息变更

  1. 服务提供商与注册中心之间有心跳续约,如果某一次检测到变更,会重新注册服务信息

  2. 注册中心推送变更给服务调用者,服务调用者进行更新

目前开源的注册中心框架有很多,国内比较常见的有:

  • Eureka:Netflix公司出品,目前被集成在SpringCloud当中,一般用于Java应用
  • Nacos:Alibaba公司出品,目前被集成在SpringCloudAlibaba中,一般用于Java应用
  • Consul:HashiCorp公司出品,目前集成在SpringCloud中,不限制微服务语言

Nacos

国内产品,中文文档比较丰富,而且同时具备配置管理功能

Docker中部署

/root/nacos/custom.env文件

修改主机IP、用户、密码(若使用其他数据库注意更换)

PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=IP
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=用户(root)
MYSQL_SERVICE_PASSWORD=密码
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai

root目录下

如果存在准备好的nacos镜像,则执行命令docker load -i 镜像包.tar

然后运行

docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
--network 网络名称 \
nacos/nacos-server:latest (或nacos/nacos-server:v2.1.0-slim,镜像名:版本号)

服务注册

  1. 引入nacos discovery依赖
<!-- nacos 服务初测发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 配置Nacos地址
spring:
application:
name: 服务器名称
cloud:
nacos:
server-addr: IP:nacos的端口

服务发现

  1. 引入nacos discovery依赖

  2. 配置Nacos地址

  3. 服务发现

    private final DiscoveryClient discoveryClient;

    private void handleCartItems(List<??VO> vos) {
    // 1.根据服务名称,拉取服务的实例列表
    List<ServiceInstance> instances = discoveryClient.getInstances("服务名称,如item-service");
    // 2.负载均衡,挑选一个实例
    ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));
    // 3.获取实例的IP和端口
    URI uri = instance.getUri();
    ……
    }