注册中心

为什么引入注册中心?

引入注册中心的主要原因是为了解决微服务架构中服务发现和动态管理的问题。在微服务架构中,服务提供者和消费者之间需要进行远程调用 。由于微服务数量众多且动态变化,手动维护服务地址列表不仅效率低下,而且容易出错。注册中心的引入解决了这些问题。

1、服务发现:服务启动时,服务提供者会向注册中心自己的服务信息(包括服务名、IP、端口等)。服务消费者可以从注册中心订阅所需的服务,获取服务实例列表。这样,消费者无需直接维护服务者的地址列表,提高了系统的灵活性和可扩展性。

2、动态管理:当服务提供者实例宕机或新增实例时,注册中心会通过心跳机制检测到这些变化,并更新服务实例列表。服务消费者会订阅这些变更,从而实时更新本地缓存的服务列表,确保调用的准确性。

3、负载均衡:服务消费者从注册中心获取服务实例列表后,可以通过负载均衡算法选择一个实例进行调用,提高了系统的负载均衡能力和响应速度。

4、解藕服务提供者和消费者:注册中心的存在使得服务提供者和消费者之间不需要直接交互,减少它们之间的耦合度,使得系统更加灵活和可维护。

什么是Nacos?

Nacos是Dynamic Naming and Configuration Service的首字母简称,一个易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

接入Nacos服务注册与发现

接入服务

如果要在项目中使用Nacos来作为服务发现的组件。需要进行以下操作:

1、需要在Pom.xml文件中引入group ID为com.alibaba.cloud和artifact ID为spring-cloud-starter-alibaba-nacos-discovery的starter:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、添加应用配置:在应用的/src/main/resources/application.properties配置文件中配置Nacos Server地址:

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

3、使用@EnableDiscoveryClient注解开启服务注册与发现功能:

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }

    @RestController
    class EchoController {
        @GetMapping(value = "/echo/{string}")
        public String echo(@PathVariable String string) {
            return string;
        }
    }
}

验证

1、服务查询

使用Shell终端输入如下命令查询,可以看到服务节点已经成功注册到Nacos Server。

$ curl http://127.0.0.1:8848/nacos/v1/ns/catalog/instances?serviceName=service-provider&clusterName=DEFAULT&pageSize=10&pageNo=1&namespaceId=

响应结果:

{
  "list": [
    {
      "ip": "192.168.3.19",
      "port": 1000,
      "weight": 1,
      "healthy": true,
      "enabled": true,
      "ephemeral": true,
      "clusterName": "DEFAULT",
      "serviceName": "DEFAULT_GROUP@@service-provider",
      "metadata": {
        "preserved.register.source": "SPRING_CLOUD"
      },
      "instanceHeartBeatInterval": 5000,
      "instanceHeartBeatTimeOut": 15000,
      "ipDeleteTimeout": 30000
    }
  ],
  "count": 1
}

服务消费

应用配置


采用RestTemplate、LoadBalanced来实现。

引入相关配置

采用RestTemplate方式

1、添加引用

<!-- loadbalancer 负载均衡器依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

2、添加@LoadBlanced注解,使得RestTemplate接入Ribbon:

@Configuration
public class RestConfig {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){return new RestTemplate();}
}

3、将两者注入到 Controller 中:

@RestController
 public class TestController {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private EchoService echoService;

    @GetMapping(value = "/echo-rest/{str}")
    public String rest(@PathVariable String str) {
        return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
    }
    @GetMapping(value = "/echo-feign/{str}")
    public String feign(@PathVariable String str) {
        return echoService.echo(str);
    }
}

4、添加必要的配置
在项目中的/src/main/resources/application.properties文件中添加如下配置:

spring.application.name=service-consumer
server.port=18083

5、启动应用

  • ide直接启动
  • 打包编译后启动
验证

1、请求http://127.0.0.1:18083/echo-rest/1234地址,可以看到返回结果"hello Nacos Discovery 134",证明服务发现生效。

$ curl http://127.0.0.1:18083/echo-rest/1234

响应结果

hello Nacos Discovery 1234