每日一课 | 服务注册与发现

分手后的思念是犯贱 2022-10-11 13:50 235阅读 0赞

40f519ab0ea15ebb5e907c0d21bf21c2.png

07.

服务注册与发现

大家好,我是营长,上期给大家分享——初识Spring Cloud

本期分享内容:服务注册与发现

本期邀请的是李熠老师(某大型互联网公司系统架构师)为我们分享《Spring Cloud快速入门》专栏。

Spring Cloud

服务注册与发现

我们知道,微服务是一个架构思想,而 Spring Cloud 集成了用以实现微服务架构的方方面面。从本文开始,我将带领大家逐个击破 Spring Cloud 的各个模块。

本课我们先来学习服务的注册与发现,Spring Cloud Netflix 的 Eureka 组件是服务于发现模块。

服务注册与发现模块分为服务注册中心和服务提供者,接下来,我将一一讲解。

服务注册中心

首先,创建一个 Maven 主工程,主工程的 pom.xml 添加如下内容:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.1.3.RELEASE</version>
  5. <relativePath/>
  6. </parent>
  7. <dependencyManagement>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-dependencies</artifactId>
  12. <version>Greenwich.RELEASE</version>
  13. <type>pom</type>
  14. <scope>import</scope>
  15. <exclusions>
  16. </exclusions>
  17. </dependency>
  18. </dependencies>
  19. </dependencyManagement>

接着,在主工程基础上创建两个 module:一个 module 为服务注册中心,一个 module 为服务提供者(即客户端)。

下面将详细演示如何创建服务注册中心。

1.右键工程 -> New -> Module,如下图所示:

7d049a87790d198039d9b57dae8b53bc.png

2.选择 next,输入 moudle 名,如下图所示:

8f7f5b13361ebb1fd947932a17db1b32.png

459c572e7b65785327cd360e9b8bd8b6.png

3.点击 next -> finish,如下图所示:

941f9b3258ba18a1defe01fe6a0f3a9c.png

4.然后在 pom.xml 添加依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  13. </dependency>
  14. </dependencies>

其中 hystrix 为熔断器,Eureka Server 默认集成了熔断器,因此必须添加此依赖,否则启动会报错。eureka-client 服务提供者依赖,在这里添加该依赖,说明 Eureka Server 也可以作为服务提供者存在。

创建启动类 Application.java:

  1. @SpringCloudApplication
  2. @EnableEurekaServer
  3. public class Application {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Application.class, args);
  6. }
  7. }

这里,我们注意到除了前面提到的 @SpringCloudApplication 外,这个类还增加了一个注解:EnableEurekaServer,这个注解的作用就是标注该应用程序是一个注册中心,只是添加这个注解还不够,还需要增加配置。

在 resources 下面创建 application.yml 并添加如下内容:

  1. server:
  2. port: 8761
  3. spring:
  4. application:
  5. name: eurekaserver
  6. profiles:
  7. active: dev
  8. cloud:
  9. inetutils:
  10. preferred-networks: 127.0.0.1
  11. client:
  12. ip-address: 127.0.0.1
  13. eureka:
  14. server:
  15. peer-node-read-timeout-ms: 3000
  16. enable-self-preservation: true
  17. instance:
  18. prefer-ip-address: true
  19. instance-id: ${spring.cloud.client.ip-address}:${server.port}
  20. client:
  21. registerWithEureka: true
  22. fetchRegistry: false
  23. healthcheck:
  24. enabled: true
  25. serviceUrl:
  26. defaultZone: http://127.0.0.1:8761/eureka/

启动该应用程序,打开浏览器并访问:http://localhost:8761。如果看到如下界面,说明注册中心已经启动起来了:

3acbfe1d2a847f5edd8623b68796fbbc.png

我们可以看到 eurekaserver 将自己也注册进去了。

下面说明一下注册中心各个配置项的含义。

  • eureka.server.enable-self-preservation:是否开启自我保护,默认为 true,在开启自我保护的情况下,注册中心在丢失客户端时,会进入自动保护模式,注册中心并不会将该服务从注册中心删除掉。这里我设置为 false,即关闭自我保护。根据我的经验,如果设置为 true,在负载均衡条件下,一个服务挂掉后,注册中心并没有删掉该服务,会导致客户端请求的时候可能会请求到该服务,导致系统无法访问,因此我推荐将这个属性设置为 false。
  • eureka.instance.prefer-ip-address:是否以 IP 注册到注册中心,Eureka 默认是以 hostname 来注册的,如果设置为 false,可以 eurekaserver 管理界面显示的地址为本机 hostname,如图:

    c53e80885e1b483f93a1a8cb57c703c4.png

当然,我们也可以通过 eureka.instance.hostname 来修改 hostname 的值。读者可以尝试,并查看效果。

  • client.serviceUrl.defaultZone:注册中心默认地址。
  • eureka.server.peer-node-read-timeout-ms:微服务节点连接超时时间。
  • eureka.instance.instance-id:注册限制的实例 ID,即上图显示的 127.0.0.1:8761。

建议读者按照以上的配置项写就行了。

服务提供者

我们有了注册中心,那么就可以创建一个服务提供者(即客户端)注册到注册中心去了。

同样地,按照注册中心的创建方式,创建一个 module,并且在 pom.xml 添加如下内容:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-web</artifactId>
  13. </dependency>
  14. </dependencies>

其中,spring-boot-starter-web 集成了 SpringMVC,在服务提供者,必须添加此依赖,否则无法启动该应用。如图:

f8f6e10dd9ee253390b15c13aa4df9d3.png

然后创建 Application.java:

  1. @SpringCloudApplication
  2. public class Application {
  3. public static void main(String[] args) {
  4. SpringApplication.run(Application.class, args);
  5. }
  6. }

@SpringCloudApplication 注解包含了 @EnableDiscoveryClient 注解,因此无需显式开启服务发现。

然后创建配置文件 application.yml:

  1. eureka:
  2. client:
  3. serviceUrl:
  4. defaultZone: http://localhost:8761/eureka/
  5. server:
  6. port: 8762
  7. spring:
  8. application:
  9. name: eurekaclient

其中,spring.application.name 为该服务的名字,eureka.client.serviceUrl.defaultZone 的作用是指定注册中心的地址。

然后启动该工程,重新访问:http://localhost:8761,即可看到如下界面:

ba80a89a79e0f814bf57a98cfe62e9e6.png

我们可以看到,刚刚创建的服务提供者 eurekaclient 已经被注册到注册中心了。

以上就是本文关于 Eureka 服务注册与发现的内容,仅仅只学习上面的知识还远远不够,我们把所有的模块都学习完后,在第14课将带领大家结合 Spring Cloud 的各个模块实现一套完整的基于 Spring Cloud 微服务架构的实例。‍

今日内容有get吗,欢迎各位留言讨论!

以上,咱们《Spring Cloud快速入门》七天专栏打卡就结束了,如需了解更多,小伙伴们可识别下方二维码,订阅专栏,咱们下期专栏见!

了解更多详情

可识别下方二维码

ae8d2d52c933af4f1c5c48107a7c4504.png

发表评论

表情:
评论列表 (有 0 条评论,235人围观)

还没有评论,来说两句吧...

相关阅读

    相关 服务注册发现

    在分布式系统中,各个子系统都是多个实例存在,这个时候必须要引入一个服务协调器,用于给调用方提供可用的调用提供者的命名消息。 服务协调器,如zookeeper,etcd,eu