Spring Cloud 讲解 (一) | Spring Cloud Eureka

Spring Cloud Eureka

作用:构建服务注册中心、服务注册与发现,对微服务应用实例化的自动化管理。

场景:最初,微服务系统数目不多时,我们通过做一些静态配置来完成服务的调用。但是后来系统功能越来越复杂,服务数目不断增加,集群规模、服务的位置和命名等都可能发生变化,那么静态配置就越来越难以维护,继续使用手工维护就会消耗大量的精力且易出错。

1. 服务注册

服务注册中心:每个服务单元向服务注册中心登记自己提供的服务,包含主机和端口号、版本号、通信协议等。当这些服务的进程启动后,注册中心就会维护这些服务的服务清单,并以心跳方式监测服务的可用性,不可用就从服务清单中剔除。

2. 服务发现

服务A希望调用服务B --> A向注册中心发起咨询服务请求 --> 服务注册中心返回B服务的所有位置清单给A --> A以某种轮询策略取出B的一个位置来进行服务调用。

但实际上为了性能等原因,不是每次都向服务注册中心获取服务清单,会采取一些缓存策略,这里只是简单说明了服务治理逻辑,不做深入讲解。

Spring Cloud Eureka 包含了服务端组件和客户端组件。

Eureka服务端:服务注册中心,支持高可用。
Eureka客户端:处理服务注册与发现。

3. 搭建服务注册中心:

<1> 新建子模块EurekaServer ,在pom.xml中引入依赖:

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

<2> 配置Eureka Server

默认情况下,Eureka server 也是一个Eureka client,必须要指定一个server,配置如下(resources\application.yml):

server:
  port: 1111

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #代表不向注册中心注册自己
    fetch-registry: false #由于注册中心的职责就是维护服务实例,它并不需要去检索服务
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

<3> 启动服务注册中心

通过@EnableEurekaServer注解启动服务注册中心提供给其他应用进行对话 :

@EnableEurekaServer //启动一个服务注册中心提供给其他应用进行对话
@SpringBootApplication
public class EurekaServerApplication {

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

在完成了上面的配置后,启动应用并访问http://www.localhost:1111/, 即可访问注册中心,如果有服务已经注册,面板中会显示注册应用的信息:


至此,一个简单的服务注册中心搭建完毕。

4. 服务注册:

<1> 新建子服务a_service,在pom.xml中引入依赖:

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

<2> 配置服务注册信息(resources\application.yml):

server:
  port: 8180  #服务的端口

spring:
  application:
    name: aService #服务命名, 注意:不能使用下划线等!

eureka:
    client:
      service-url:
        defaultZone: http://localhost:1111/eureka/ #指定服务注册中心的地址

其中,spring.application.name服务名称,之后服务与服务之间的相互调用一般都是根据这个值。

<3> 激活服务发现

在主类中添加注解@EnableEurekaClient,来激活服务发现,使得服务可以被发现和调用:

@EnableEurekaClient //激活服务发现
@SpringBootApplication
public class AServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(AServiceApplication.class, args);
    }
}

完成上面配置后,启动服务注册中心服务以及aService服务,再次打开注册中心http://localhost:1111/eureka/,会看到aService已经出现在服务列表中:

5. 服务调用示例:

<1> 在aService中新建文件HelloControl.java,添加hello方法:

@SpringBootApplication
@RestController
public class HelloControl {

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

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

<2> 浏览器中访问:http://localhost:8180/hello?name=Tom,得到结果如下:

点击此处获取本节: 示例代码


版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接。

Comments
Write a Comment