【Dalston】服务注册与发现(Eureka、Consul)

微服务架构

将一个完整的应用从数据存储开始垂直拆分成多个不同的服务,每个服务都能独立部署、独立维护、独立拓展,服务与服务间通过RESTful API等方式互相调用。

服务治理

由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下,我们可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。

Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。

创建服务注册中心

初始化一个Spring Boot工程,命名为eureka-server,并在pom.xml中引入如下的依赖:

需要注意的是,Spring Boot版本最多支持1.5.4.RELEASE

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

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

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在启动类中新增注解@EnableEurekaServer,启动一个服务注册中心提供给其它应用进行对话。

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

默认情况下,服务中心会将自己作为客户端来尝试注册自己,所以需要禁用它。需要在application.yaml中做出如下配置:

server:
  port: 1001

spring:
  application:
    name: eureka-server

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false

启动项目后,访问http://localhost:1001/

访问项目

创建服务提供方

创建一个服务提供方,并向服务中心注册自己。尝试在服务提供方中提供一个接口,来获取当前所有的服务信息。创建一个Spring Boot项目,命名为eureka-client,在pom.xml中引入如下依赖:

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

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

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

提供一个可访问的接口:

@RestController
public class DcController {

    @Autowired
    DiscoveryClient discoveryClient;

    @GetMapping("/dc")
    public String dc(){
        String services = "Services: " + discoveryClient.getServices();
        System.out.println(services);
        return services;
    }
}

在主类中使用@EnableDiscoveryClient注解,激活Eureka中的DiscoveryClient实现,这样才能实现Controller中对服务信息的输出。

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

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

application.yaml中做出如下配置:

server:
  port: 2001
spring:
  application:
    # 指定微服务名称,调用时使用该名称进行访问
    name: eureka-client

eureka:
  client:
    service-url:
      # 对应服务注册中心配置内容,
      defaultZone: http://localhost:1001/eureka/

启动工程后,访问http://localhost:1001/,就可以看到我们的服务已经注册到了服务注册中心。

访问服务注册中心Web

此时访问http://localhost:2001/dc,我们可以得到如下输出返回:

服务注册成功

其中,方括号中的eureka-client就是通过Spring Cloud定义的DiscoveryClient接口在eureka的实现中获取到的所有服务清单。由于Spring Cloud在服务发现这一层做了非常好的抽象,所以,对于上面的程序,我们可以无缝的从eureka的服务治理体系切换到consul的服务治理体系中区

Spring Cloud Consul

Spring Cloud Consul项目是针对Consul的服务治理实现。Consul是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。它包含了下面几个特性:

  • 服务发现
  • 健康检查
  • key/value存储
  • 多数据中心

安装Consul参考另外一篇文章:Windows上安装Spring Cloud Consul

Spring Cloud Consul项目的实现,我们可以轻松的将基于Spring Boot的微服务应用注册到Consul上,并通过此实现微服务架构中的服务治理。

eureka-client项目中的pom.xml中引入如下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

修改application.yaml中的配置

server:
  port: 2001
spring:
  application:
    # 指定微服务名称,调用时使用该名称进行访问
    name: eureka-client
  cloud:
    consul:
      port: 8500
      host: localhost
eureka:
  client:
    service-url:
      # 对应服务注册中心配置内容,
      defaultZone: http://localhost:1001/eureka/

重新启动eureka-client工程就可以了,此时在访问consul的ui界面就可以看到服务注册成功了。

文章发布自:笑凡尘,转载请注明出处,谢谢!