Spring Cloud入门之Eureka注册中心

Spring Cloud 之 Eureka注册中心(服务注册与发现)

1、Spring Cloud简介

  Spring Cloud是为开发者提供快速构建分布式系统(微服务)的一套工具集合,它为分布式开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、临时令牌、全局锁、决策竞选、分布式会话和集群状态管理等通用问题提供了解决方案。

  Spring Cloud包含了多个子项目,比如:Spring Cloud Azure、Spring Cloud Alibaba、Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Bus等。每个子项目都对应了分布式系统中涉及的一类开源产品,每一类开源项目都提供了一种或几种通用问题解决方案,比如Spring Cloud Alibaba子项目,就提供了Alibaba Sentinel、Alibaba Nacos等子模块,分别对应流控和服务降级、服务注册和发现及配置中心等功能。

2、服务治理

  服务治理是微服务架构中最核心和基础的模块,主要用来实现各个微服务实例的注册和发现。

  在服务治理架构中,一般包括了注册中心和服务两种角色,其中服务又可以分为服务提供者和服务消费者(可能即使服务提供者又是服务消费者)。服务提供者通过服务注册向注册中心登记自己可以提供的服务,并将服务提供者的一些元数据(比如:主机名或IP地址、端口号、版本号、通信协议等)保存到了注册中心中。服务消费者通过注册中心发现所需服务,并直接调用对应的服务,这个时候服务提供方对消费者是透明的,服务提供方可能是单个实例也可能是集群部署等,消费者都不需要关心,只需要从服务清单中根据一定策略查询提供服务并进行调用即可。

  在微服务架构中,能够提供服务治理的框架很多,比如:Eureka、Consul、Nacos、Zookeeper等。我们这里主要来学习和使用Eureka。

3、Spring Cloud Eureka

  Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。它既包含了服务端,也包含了客户端,其中服务端即是注册中心,而客户端主要提供服务的注册与发现。

4、搭建注册中心,即Eureka服务端

4.1、添加Eureka服务端依赖

  在pom.xml中,添加spring-cloud-starter-netflix-eureka-server依赖即可。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
4.2、修改application.properties配置文件
spring.application.name=qriver-eureka-server
server.port=8000

#配置主机名
eureka.instance.hostname=localhost
#默认为true。表示是否将自己注册到Eureka Server。本身就是Eureka Server,所以设置为false。
eureka.client.register-with-eureka=false
#服务获取,定期的更新客户端的服务清单,以保证服务访问的正确性
eureka.client.fetch-registry=false
#设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
4.3、在启动类添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}
4.4、启动、验证

  完成了上述配置后,启动应用。当启动成功后,访问http://localhost:8000/,可以看到如下界面,说明注册中心部署成功了。

刚启动的时候,“Instances currently registered with Eureka”列表中不会有服务被注册。

5、服务提供者注册

  我们提供了一个测试应用,用来作为服务提供者注册到注册中心中,同时提供一个“/provider”服务接口供其他服务调用。

5.1、添加依赖

  其中spring-boot-starter-web依赖为了提供服务接口,而spring-cloud-starter-netflix-eureka-client引入了Eureka客户端依赖,提供了服务注册和发现的能力。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
5.2、修改application.properties配置文件
spring.application.name=eureka-provider
server.port=8010

#设置与Eureka Server交互的地址,即配置注册中心地址。
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka/
5.3、编写测试接口

  提供了一个"/provider"接口,用测试。

@Controller
public class ProviderController {

    Logger logger = Logger.getLogger(ProviderController.class);

    @RequestMapping("/provider")
    @ResponseBody
    public String provider(){
        logger.info("调用服务提供者ProviderController的provider()方法!");
        return "Hello World!";
    }

}
5.4、启动类,添加服务注册和发现需要的注解

  在启动类上添加@EnableDiscoveryClient注解即可。

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaProviderApplication {

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

}
5.5、启动,验证

  启动服务提供者后,可以直接访问测试即可,可以正常返回结果并在控制台打印日志。这时候登录服务注册中心,会发现“Instances currently registered with Eureka”列表中出现了“EUREKA-PROVIDER”服务信息。说明服务注册成功了,后续我们尝试如何通过注册中心调用服务提供者中的接口。

6、服务消费者

  我们将创建一个服务消费者,验证通过注册中心获取服务提供者,并调用提供者对应的接口。

6.1、添加依赖

  依赖文件和服务提供者类似,但是如果服务消费者,只是需要消费服务接口,而不需要将服务注册到注册中心,则可以不添加spring-cloud-starter-netflix-eureka-client依赖(主要用于服务注册和发现,一般是需要的添加该依赖的,因为还需要使用服务发现的功能,这里选择使用了Spring Cloud Commons提供的@EnableDiscoveryClient注解进行服务发现,所以可以不添加该注解)。

6.2、修改application.properties配置文件

  可以根据实际情况,选择是否把当前应用注册到注册中心中。

spring.application.name=eureka-consumer
server.port=8020

#设置与Eureka Server交互的地址。
#eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka/
6.3、编写测试类

  编写测试类,通过服务注册中心获取服务实例,再通过服务实例调用对应的接口。这里只是简单演示了如何调用服务提供者对应的接口而已,后续会学习如何通过负载均衡并优雅的调用服务提供者的接口。这里注入了两个对象,分别是DiscoveryClient和RestTemplate,前者主要用来实现服务的发现,需要在启动类上添加@EnableDiscoveryClient注解开启该功能;后者,也在启动类中通过@Bean的方式创建了一个RestTemplate实例。

@RestController
public class ConsumerController {

    Logger logger = Logger.getLogger(ConsumerController.class);

    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/consumer")
    public String consumer(){
        logger.info("执行消费者ConsumerController的consumer()方法!");
        List<ServiceInstance> instances = discoveryClient.getInstances("eureka-provider");
        if(instances != null && instances.size() > 0){
            ServiceInstance instance = instances.get(0);
            String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/provider";
            String re = restTemplate.getForObject(url,String.class);
            return re;
        }
        return "没有发现eureka-provider服务提供者!";
    }
}
6.4、启动类

  启动类和服务提供者的启动类类似,需要通过@EnableDiscoveryClient注解开启服务发现功能。这里虽然没有使用Eureka提供的服务发现能力,但是还是通过Spring Cloud Commons提供的@EnableDiscoveryClient注解实现了服务发现的功能。同时,为了实现调用HTTP接口,这里注入了一个RestTemplate实例,用来实现服务提供者接口的调用。

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaConsumerApplication {

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

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

}
6.5、启动、测试

  启动应用程序,这个时候可以先访问注册中心,会发现“Instances currently registered with Eureka”列表中并没有把该应用注册进去。然后,再访问http://localhost:8020/consumer,这个时候,就会返回服务提供者接口返回的值,分别查看对应的控制台,会发现两个方法均被调用了。

需要注意:服务消费者也可以注册到服务注册中心的,这里只是为了验证没有添加相关配置而已。

猜你喜欢

转载自blog.csdn.net/hou_ge/article/details/111536996
今日推荐