当前位置:   article > 正文

SpringCloud学习笔记:Eureka注册中心_springcloud服务注册中心学习笔记

springcloud服务注册中心学习笔记

简介

Eureka是Netflix开源的基于rest的服务治理方案,分为Server端和Client端,Server端为注册中心,其他微服务通过Client端连接Server端进行服务的注册和发现。

项目介绍

  1. sc-parent,父模块
  2. sc-provider,提供者模块
  3. sc-eureka,注册中心
  4. sc-consumer-discovery,消费者模块

搭建父模块

创建父模块sc-parent,pom.xml:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId> com.cf</groupId>
  4. <artifactId>sc-parent</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <packaging>pom</packaging>
  7. <!-- 继承Spring Boot的默认值 -->
  8. <parent>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-parent</artifactId>
  11. <version>2.1.6.RELEASE</version>
  12. <relativePath /> <!-- lookup parent from repository -->
  13. </parent>
  14. <properties>
  15. <!-- 降低maven-jar-plugin插件版本,防止版本不匹配导致的pom.xml第一行报错 -->
  16. <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
  17. </properties>
  18. <dependencies>
  19. <!-- 添加web应用依赖 -->
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. </dependencies>
  25. <dependencyManagement>
  26. <dependencies>
  27. <!-- SpringCloud依赖 -->
  28. <dependency>
  29. <groupId>org.springframework.cloud</groupId>
  30. <artifactId>spring-cloud-dependencies</artifactId>
  31. <version>Greenwich.SR2</version>
  32. <type>pom</type>
  33. <scope>import</scope>
  34. </dependency>
  35. </dependencies>
  36. </dependencyManagement>
  37. <build>
  38. <plugins>
  39. <!-- 打可执行jar包插件 -->
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. </plugin>
  44. <!-- 指定编译插件使用的jdk版本 -->
  45. <plugin>
  46. <groupId>org.apache.maven.plugins</groupId>
  47. <artifactId>maven-compiler-plugin</artifactId>
  48. <configuration>
  49. <source>1.8</source>
  50. <target>1.8</target>
  51. </configuration>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>

搭建注册中心

1.在父模块下创建子模块项目sc-eureka,pom.xml:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <parent>
  4. <groupId>com.cf</groupId>
  5. <artifactId>sc-parent</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. </parent>
  8. <artifactId>sc-eureka</artifactId>
  9. <dependencies>
  10. <!-- Eureka服务端依赖 -->
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  14. </dependency>
  15. </dependencies>
  16. </project>

2.创建启动类eureka.EurekaApplication:

  1. package eureka;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. //声明该类为SpringBoot服务的入口
  6. @SpringBootApplication
  7. //声明该微服务为注册中心,提供服务发现和注册的功能
  8. @EnableEurekaServer
  9. public class EurekaApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(EurekaApplication.class, args);
  12. }
  13. }

3.创建配置文件/src/main/resources/application.yml:

  1. server:
  2. port: 8080 #当前服务端口
  3. eureka:
  4. instance:
  5. hostname: localhost #当前Eureka实例主机名
  6. client:
  7. registerWithEureka: false #表示不向注册中心注册自己
  8. fetchRegistry: false #表示此客户端不需要从Eureka注册中心获取Eureka注册表信息
  9. serviceUrl:
  10. defaultZone: http://localhost:8080/eureka/ ##eureka对外提供的地址(客户端连接的地址)

其他配置信息可以参考EurekaInstanceConfigBean和EurekaClientConfigBean两个配置类

4.运行启动类EurekaApplication,在浏览器中访问http://localhost:8080/,出现如下图表示注册中心搭建成功:

提供者与服务注册

1.在父模块下创建子模块项目sc-provider,pom.xml:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <parent>
  4. <groupId>com.cf</groupId>
  5. <artifactId>sc-parent</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. </parent>
  8. <artifactId>sc-provider</artifactId>
  9. <dependencies>
  10. <!-- Eureka客户端依赖,用于连接服务端进行服务注册和发现 -->
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  14. </dependency>
  15. </dependencies>
  16. </project>

2.创建启动类provider.ProviderApplication:

  1. package provider;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class ProviderApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(ProviderApplication.class, args);
  8. }
  9. }

3.创建Controller:provider.controller.BookController

  1. package provider.controller;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RequestMapping("/book")
  6. @RestController
  7. public class BookController {
  8. @GetMapping("/list")
  9. public String getBookList(){
  10. //模拟从service返回数据
  11. return "[\"Java入门到放弃\",\"C++入门到放弃\",\"Python入门到放弃\",\"C入门到放弃\"]";
  12. }
  13. }

4.创建配置文件/src/main/resources/application.yml:

  1. server:
  2. port: 8081
  3. spring:
  4. application:
  5. name: sc-provider #注册到Eureka注册中心上的服务名称,对应Eureka界面上的Application列
  6. eureka:
  7. client:
  8. serviceUrl:
  9. defaultZone: http://localhost:8080/eureka/ #注册中心的访问地址
  10. instance:
  11. preferIpAddress: true #表示将自己的IP注册到Eureka注册中心。默认为false,表示将hostname注册到注册中心

5.依次启动注册中心sc-eureka和提供者sc-provider,当提供者启动时,会将自己的信息注册到Eureka注册中心,在浏览器中访问http://localhost:8080/,提供者sc-provider已经在注册中心注册。

消费者和服务发现

1.在父模块下创建子模块项目sc-consumer-discovery,pom.xml:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <parent>
  4. <groupId>com.cf</groupId>
  5. <artifactId>sc-parent</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. </parent>
  8. <artifactId>sc-consumer-discovery</artifactId>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  13. </dependency>
  14. </dependencies>
  15. </project>

2.创建启动类consumer.ConsumerDiscoveryApplication:

  1. package consumer;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.web.client.RestTemplate;
  6. @SpringBootApplication
  7. public class ConsumerDiscoveryApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(ConsumerDiscoveryApplication.class, args);
  10. }
  11. @Bean
  12. public RestTemplate restTemplate(){
  13. return new RestTemplate();
  14. }
  15. }

3.创建调用提供者服务的Controller:consumer.controller.ConsumerDiscoveryController

  1. package consumer.controller;
  2. import java.util.List;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.cloud.client.ServiceInstance;
  5. import org.springframework.cloud.client.discovery.DiscoveryClient;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.client.RestTemplate;
  9. @RestController
  10. public class ConsumerDiscoveryController {
  11. @Autowired
  12. private DiscoveryClient discoveryClient;
  13. @Autowired
  14. private RestTemplate restTemplate;
  15. @GetMapping("/getBookList")
  16. public String getBookList(){
  17. //通过服务名获取实例信息
  18. List<ServiceInstance> list = discoveryClient.getInstances("sc-provider");
  19. if (list != null && list.size() > 0 ) {
  20. //调用服务,并返回服务结果
  21. return restTemplate.getForObject(list.get(0).getUri() + "/book/list", String.class);
  22. }
  23. return null;
  24. }
  25. }

4.创建application.yml:

  1. server:
  2. port: 8082
  3. spring:
  4. application:
  5. name: sc-consumer-discovery
  6. eureka:
  7. client:
  8. registerWithEureka: false #在本实例中消费者不提供服务,所以无需到注册中心注册。在实际应用中,消费者也可能是提供者。
  9. serviceUrl:
  10. defaultZone: http://localhost:8080/eureka/

5.依次启动注册中心sc-eureka、提供者sc-provider、消费者sc-consumer-discovery,当消费者启动时,会从注册中心查询可用的服务列表及其网络地址。直接访问提供者和消费者调用提供者结果如下:

总结

在传统的应用程序中,都是把提供者的网络地址硬编码在代码中,导致提供者和消费者耦合度高,当提供者网络地址发生了变化,则需要修改消费者配置并重新发布。Eureka起到了解耦的作用,提供者到Eureka注册中心中注册,消费者从Eureka注册中心中获取提供者的网络地址并进行调用,当提供者网络地址变更时会重新到注册中心注册。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/430682
推荐阅读
相关标签
  

闽ICP备14008679号