使用Spring Cloud搭建服务注册中心

- 日理万妓 2022-04-18 05:39 291阅读 0赞

阿里的分布式服务框架dubbo也是个分布式服务框架,但是它无法单独完成工作,它需要依赖Apache的zookeeper来作为服务注册中心(不是必需的,但依靠zookeeper是最好的),才能实现一个较好的分布式应用。与dubbo不同的是,Spring Cloud是一个一站式分布式框架,Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环境中运行良好。那么今天我希望通过一个简单的案例带小伙伴们来了解下Spring Cloud。


那么本文我主要想介绍下在Spring Cloud中使用Eureka搭建一个服务注册中心,然后再向其中注册服务。由于Spring Cloud是在Spring Boot的基础上构建分布式服务的,所以阅读本文需要有一点Spring Boot的知识储备。


首先我要说的是Spring Cloud并不是一个东西,和Hadoop类似,Spring Cloud也包含了许多个子项目,我们今天要看的Eureka只是其中的一个子项目,Eureka的功能有点类似于zookeeper,它是一个服务治理组件,包含了服务注册中心、服务注册与发现机制。


接下来直接操作:

用一个项目搭建服务注册中心

(1)首先创建一个springboot项目,可通过start.spring.io快速创建,或者通过idea快速创建。

(2)创建好之后,增加依赖(springcloud核心依赖),因为使用使用Eureka搭建搭建服务注册中心,所以还要Eureka依赖.

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>org.sang</groupId>
  6. <artifactId>eureka-server</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>eureka-server</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>1.5.6.RELEASE</version>
  15. <relativePath/> <!-- lookup parent from repository -->
  16. </parent>
  17. <properties>
  18. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  20. <java.version>1.8</java.version>
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.cloud</groupId>
  29. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-test</artifactId>
  34. <scope>test</scope>
  35. </dependency>
  36. </dependencies>
  37. <dependencyManagement>
  38. <dependencies>
  39. <dependency>
  40. <groupId>org.springframework.cloud</groupId>
  41. <artifactId>spring-cloud-dependencies</artifactId>
  42. <version>Dalston.SR3</version>
  43. <type>pom</type>
  44. <scope>import</scope>
  45. </dependency>
  46. </dependencies>
  47. </dependencyManagement>
  48. <build>
  49. <plugins>
  50. <plugin>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-maven-plugin</artifactId>
  53. </plugin>
  54. </plugins>
  55. </build>
  56. </project>

依赖的添加参考了Eureka官网的 http://projects.spring.io/spring-cloud/。

(3)启动一个服务注册中心:

启动一个服务注册中心的方式很简单,就是在Spring Boot的入口类上添加一个@EnableEurekaServer注解,如下:

@EnableEurekaServer

@SpringBootApplication

public class EurekaServerApplication {

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

}

(4)配置服务注册中心:

最后我们再做一点简单的配置就可以了,配置就写在Spring Boot的配置文件application.properties中,写法如下:

server.port=1111

eureka.instance.hostname=localhost

eureka.client.register-with-eureka=false

eureka.client.fetch-registry=false

eureka.client.service-url.defaultZone=http://$\{eureka.instance.hostname\}:$\{server.port\}/eureka/

上面的代码意思:

1.server.port=1111表示设置该服务注册中心的端口号
2.eureka.instance.hostname=localhost表示设置该服务注册中心的hostname
3.eureka.client.register-with-eureka=false,由于我们目前创建的应用是一个服务注册中心,而不是普通的应用,默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种默认行为
4.eureka.client.fetch-registry=false,表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它也不需要去检索其他服务

(5)测试:

做完这一切之后,我们就可以启动这一个Spring Boot 服务,服务启动成功之后,在浏览器中输入:http://localhost:1111就能够看到如下页面:

640_wx_fmt_png_tp_webp_wxfrom_5_wx_lazy_1_wx_co_1

出现了这个页面之后,表示服务注册中心已经搭建好了。


我们之前专门有一篇博客介绍如何在Linux上安装zookeeper【Linux上安装Zookeeper以及一些注意事项】,但是对于Eureka却不存在这样的问题,因为Eureka中的服务注册中心实际上是一个Spring Boot工程,而Spring Boot工程我们知道可以直接打成一个jar包,然后java -jar命令就可以运行,不管Windows还是Linux上,运行方式都是一致的。


用新的一个项目注册服务提供者

现在服务注册中心有了之后,我们可以考虑向这个服务注册中心注册一个服务提供者了。

还是创建一个Spring Boot工程,这次创建比之前创建多一个步骤,在创建的时候选中web的starter,我们来创建一个web工程,在IntelliJ IDEA中创建的时候选中web.

(1)在创建好的工程中,我们需要添加Eureka依赖,pom文件参考如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>org.sang</groupId>
  6. <artifactId>provider</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>provider</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>1.5.6.RELEASE</version>
  15. <relativePath/> <!-- lookup parent from repository -->
  16. </parent>
  17. <properties>
  18. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  20. <java.version>1.8</java.version>
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-test</artifactId>
  30. <scope>test</scope>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.cloud</groupId>
  34. <artifactId>spring-cloud-starter-eureka</artifactId>
  35. </dependency>
  36. </dependencies>
  37. <dependencyManagement>
  38. <dependencies>
  39. <dependency>
  40. <groupId>org.springframework.cloud</groupId>
  41. <artifactId>spring-cloud-dependencies</artifactId>
  42. <version>Dalston.SR3</version>
  43. <type>pom</type>
  44. <scope>import</scope>
  45. </dependency>
  46. </dependencies>
  47. </dependencyManagement>
  48. <build>
  49. <plugins>
  50. <plugin>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-maven-plugin</artifactId>
  53. </plugin>
  54. </plugins>
  55. </build>
  56. </project>

(2)创建应用的入口,这是一个web工程,所以我们添加一个Controller,在该Controller中提供一个访问方法,如下:

  1. @RestController
  2. public class HelloController {
  3. private final Logger logger = Logger.getLogger(getClass());
  4. @Autowired
  5. private DiscoveryClient client;
  6. @RequestMapping(value = "/hello", method = RequestMethod.GET)
  7. public String index() {
  8. List<ServiceInstance> instances = client.getInstances("hello-service");
  9. for (int i = 0; i < instances.size(); i++) {
  10. logger.info("/hello,host:" + instances.get(i).getHost() + ",service_id:" + instances.get(i).getServiceId());
  11. }
  12. return "Hello World";
  13. }
  14. }

(3)激活eureka中的discoveryClient

在Spring Boot的入口函数处,通过添加@EnableDiscoveryClient注解来激活Eureka中的DiscoveryClient实现(因为我们在HelloController中注入了DiscoveryClient)。

@EnableDiscoveryClient

@SpringBootApplication

public class ProviderApplication {

public static void main(String[] args) {

  1. SpringApplication.run(ProviderApplication.class, args);

}

}

(4)配置服务名称和注册中心地址

最后的最后,我们在application.properties文件中配置一下服务名和注册中心地址即可,如下:

spring.application.name=hello-service

eureka.client.service-url.defaultZone=http://localhost:1111/eureka

这两行代码的含义很简单,跟上面对应。

(5)最后做一下测试:

做完这一切之后,我们就可以来测试了,直接运行这个Spring Boot工程,运行成功之后,我们刷新刚才的http://localhost:1111,就可以看到有一个服务已经注册成功了。如下:

640_wx_fmt_png_tp_webp_wxfrom_5_wx_lazy_1_wx_co_1 1

同时,我们查看这个服务提供者运行日志,也可以看到服务的信息,如下

640_wx_fmt_png_tp_webp_wxfrom_5_wx_lazy_1_wx_co_1 2

OK,如此之后,我们一个服务注册中心就搭建成功了,同时也有一个服务提供者成功的注册了。但是这样还有一个小问题,那就是我们这里是一个单节点的服务注册中心,一旦发生了故障整个服务就瘫痪了,所以在实际应用中,我们需要搭建高可用注册中心,那么关于高可用注册中心如何搭建的问题,我们将在下篇文章中来介绍。

本文参考原文章地址:https://mp.weixin.qq.com/s/K-WDRVLh-AFda_g7ga4iwA

发表评论

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

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

相关阅读