微服务架构升级三:注册中心

有了前面两篇文章:

作为引子,现在引出微服务架构升级最后一篇——注册中心;注册中心、配置中心、API网关是微服务开发三大核心组件,既然后两者都被成功改造了,当然也不能忽略掉前者。

Eureka架构

如图所示,在使用Eureka作为注册中心的时候,服务提供和消费的过程如下:

  1. 服务提供者把自身注册到Eureka服务器
  2. 服务消费者通过Eureka客户端获取Eureka服务器上的服务列表;
  3. 服务消费者通过Feign客户端调用某个服务;

简而言之,就是服务注册、服务发现、服务消费,改造注册中心的关键是处理好这3个问题,答案就是使用Kubernetes Service替换Eureka

为了使外部用户能够访问集群中的Pod,Kubernetes引入了一个新概念——Service,Service是一种抽象的、逻辑的概念,一个Service通过标签端口绑定了一组Pod,起到负载均衡的作用。Service和Pod之间是松耦合的,即使Pod被销毁或重新创建,Service也保持不变。当某个Service被创建之后,可通过**名称**(完整路径格式:服务名称.命名空间名称.svc.集群名称.local)访问该Service。

服务注册

当一个API服务被部署到Kubernetes集群之后,该API服务就会被自动注册到API Server了。因此,无需再注册。

服务发现

执行kubectl get svc -n XXX命令可以查看Kubernetes集群中已部署的服务列表;

Spring Cloud Kubernetes提供一个适配Kubernetes的DiscoveryClient类,可以通过getServices()方法获取服务列表,还可以通过getInstance()方法获取服务详情。

服务消费

通常,我们使用Feign客户端调用微服务,也可以用RestTemplate等等。

当使用Eureka作为注册中心时,Feign客户端的配置如下:

@FeignClient(name = "A-SERVICE", path = "/a")
public interface AClient {
    @GetMapping("/hello")
    String sayHello(@RequestParam("name") String name);
}

其中,name属性的值设置为微服务名称,借助Ribbon等实现负载均衡。

在使用Kubernetes Service替换Eureka之后,必须把Feign客户端的nameurl属性的值均设置为http://Service名称:端口号

@FeignClient(name = "http://a-service:8080", url = "http://a-service:8080", path = "/a")
public interface AClient {
    @GetMapping("/hello")
    String sayHello(@RequestParam("name") String name);
}

当然,若使用Spring Cloud Kubernetes LoadBalancer,则name属性的值可简化为Service名称

@FeignClient(name = "a-service-svc", path = "/a")
public interface AClient {
    @GetMapping("/hello")
    String sayHello(@RequestParam("name") String name);
}
写于 2023年06月12日