注册中心是什么
注册中心是一个分布式系统中的关键组成部分,它可以统一管理服务的注册与发现,用于解决分布式系统中服务间的相互调用问题。通过中心化管理,可以对服务的注册和下线进行管理,同时实现负载均衡等功能。在这里以 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 集群。