您的位置:

解密:注册中心的妙用

一、注册中心是什么

注册中心是一个分布式系统中的关键组成部分,它可以统一管理服务的注册与发现,用于解决分布式系统中服务间的相互调用问题。通过中心化管理,可以对服务的注册和下线进行管理,同时实现负载均衡等功能。在这里以Eureka为例,来介绍注册中心具体是如何工作的。

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

}

如上所示,启动一个Eureka注册中心非常简单,只需要引入Spring Cloud Eureka依赖,并在启动类上添加注解@EnableEurekaServer即可。

二、服务注册与发现

对于服务提供者,将自己服务注册到注册中心非常简单。在服务启动时,只需要向注册中心注册自己的服务名、实例IP地址、端口等信息即可。示例代码如下:

@RestController
@EnableEurekaClient
public class DemoController {

    @Value("${server.port}")
    String port;

    @RequestMapping("/hello")
    public String home(@RequestParam String name) {
        return "hello " + name + ",i am from port:" + port;
    }

}

在代码中,通过添加@EnableEurekaClient注解,将该服务注册到了Eureka注册中心,同时通过@Value注解注入服务实例的端口信息。客户端通过向注册中心发送查询请求,就可以获得可用的服务实例信息。代码如下:

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {

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

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

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/callService")
    public String callService(@RequestParam String name) {
        return restTemplate.getForObject("http://service/hello?name=" + name, String.class);
    }

}

使用RestTemplate向服务提供者发送HTTP请求时,只需要通过服务名即可获取可用的服务,这里的服务名就是在服务提供者向Eureka注册中心注册时指定的服务名。通过添加@EnableDiscoveryClient注解,就可以让该服务具有服务发现的能力。

三、高可用性与负载均衡

为了保证高可用性,我们需要搭建多个Eureka Server,同时让它们相互注册到对方。当其中一台Eureka Server挂掉时,其他Eureka Server就可以接管它的职责。这里以双节点的集群为例,来介绍Eureka Server的高可用性配置。

server.port=8761

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://localhost:8762/eureka/

在上述配置中,将当前Eureka Server注册到了localhost:8762上,同时禁止了该实例作为服务提供者进行注册。启动时指定不同的配置,就可以启动不同端口上的Eureka Server,从而搭建出一个Eureka Server集群。