SpringCloud Eureka

我会带着你远行 2024-04-18 11:48 120阅读 0赞

SpringCloud Eureka

欢迎关注微信公众号: 程序员小圈圈
原文首发于: www.zhangruibin.com
本文出自于: RebornChang的博客
转载请标明出处^_^

公众号回复:sp2,即可获取本节代码哦~~

在前文基础上新建模块springclouddemo-04-consumer-product-8002

  1. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. 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. <parent>
  5. <artifactId>springcloud-demo-01</artifactId>
  6. <groupId>com.zrb.springcloud</groupId>
  7. <version>1.0-SNAPSHOT</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <artifactId>springclouddemo-04-consumer-product-8002</artifactId>
  11. <dependencies>
  12. <dependency>
  13. <groupId>com.zrb.springcloud</groupId>
  14. <artifactId>springcloud-02-api</artifactId>
  15. <version>${project.version}</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. </dependencies>
  22. </project>

新建后项目目录如下图所示:

format_png

新建目录及文件

新建application.yml 文件,声明模块访问端口为8002.

  1. server:
  2. port: 8002

在ConfigBean.java里面,配置RestTemplate.
这里我们使用spring提供的web组件进行接口的请求,来访问8001项目获取商品信息。

ConfigBean.java

  1. package com.zhrb.springcloud.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.client.RestTemplate;
  5. /**
  6. * @ClassName ConfigBean
  7. * @Description TODO
  8. * @Author zhrb
  9. * @Date 2019/9/4 11:56
  10. * @Version
  11. */ @Configuration public class ConfigBean {
  12. // 向容器中添加 RestTemplate 组件,直接通过此组件可调用 REST 接口
  13. @Bean
  14. public RestTemplate getRestTemplate() {
  15. return new RestTemplate();
  16. }
  17. }

ProductControllerConsumer.java

  1. package com.zhrb.springcloud.controller;
  2. import com.zhrb.springcloud.entity.Product;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.*;
  5. import org.springframework.web.client.RestTemplate;
  6. import java.util.List;
  7. /**
  8. * @ClassName ProductControllerConsumer
  9. * @Description TODO
  10. * @Author zhrb
  11. * @Date 2019/9/4 11:57
  12. * @Version
  13. */
  14. @RestController
  15. @RequestMapping(value = "/consumer/product")
  16. public class ProductControllerConsumer {
  17. private static final String REST_URL_PREFIX = "http://127.0.0.1:8001";
  18. @Autowired
  19. private RestTemplate restTemplate;
  20. @PostMapping(value = "/add")
  21. public boolean add(Product product) {
  22. return restTemplate.postForObject(REST_URL_PREFIX + "/product/add",
  23. product, Boolean.class);
  24. }
  25. @GetMapping(value = "/{id}")
  26. public Product get(@PathVariable("id") Long id) {
  27. return restTemplate.getForObject(REST_URL_PREFIX + "/product/" + id,
  28. Product.class);
  29. }
  30. @GetMapping(value = "/list")
  31. public List<Product> list() {
  32. return restTemplate.getForObject(REST_URL_PREFIX + "/product/list",
  33. List.class);
  34. }
  35. }

启动类:
SpringCloudProductConsumer_8002.java

  1. package com.zhrb.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  6. /**
  7. * @ClassName SpringCloudProductConsumer_8002
  8. * @Description TODO
  9. * @Author zhrb
  10. * @Date 2019/9/4 11:59
  11. * @Version
  12. */ @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
  13. public class SpringCloudProductConsumer_8002 {
  14. public static void main(String[] args) {
  15. SpringApplication.run(SpringCloudProductConsumer_8002.class, args);
  16. }
  17. }

这里有一个小知识点,我们可以看到,8002项目所用注解,和8001项目不一样,注解后面多了一些东西,这是为什么呢?如果不加上那些会有什么错吗?看下面。

根据springboot官方文档解释,@SpringBootApplication是一个复合注解。

简单的说就是:@SpringBootApplication相当于@Configuration,@EnableAutoConfiguration,@ComponentScan。

1、@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。

2、@EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。

3、@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。

所以,在启动类上使用@SpringBootApplication时,会自动根据启动类路径进行扫描,执行了@ComponentScan,因此,在没有配置mapper时,一定要使用@DataSourceAutoConfiguration排除默认扫描配置。否则启动报错。

启动8002验证

先启动8001,再启动8002.
访问地址:localhost:8002/consumer/product/list
效果如下图所示:
format_png 1
新建完上面的那些项目之后,就迎来了我们接触springcloud的第一个组件,eureka。

Eureka

Eureka介绍

Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka 提供 Eureka Server 服务端与 Eureka Client 客户端 ,服务端即是Eureka服务注册中心,客户端完成微服务向Eureka服务的注册与发现。

客户端同时也具备一个内置的使用轮询(round-robin)负载算法的负载均衡器。在微服务启动后,将会向
Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心
跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)。

  1. Eureka Server 是服务端,负责管理各个微服务注册和发现。
  2. 在微服务上添加 Eureka Client 代码,就会访问到 Eureka Server 将此微服务注册在Eureka Server中,从而
    使服务消费方能够找到。
  3. 微服务(服务消费者)需要调用另一个微服务(服务提供者)时,从 Eureka Server 中获取服务调用地址,
    进行远程调用。

来看一下服务于注册Eureka架构图

format_png 2

看完了上面,是不是很像dubboo+zookeeper的服务注册与发现?
那么我们现在再新建一个类似dubbo-admin的模块,来进行页面视图的Eureka服务控制台。

Eureka 服务中心

新建模块springclouddemo-05-eureka-9000

新建后只需要新建两个文件:
1.application.yml

  1. server:
  2. port: 9000 # 服务端口 eureka:
  3. instance: hostname: eureka-server # eureka服务端的实例名称
  4. client:
  5. registerWithEureka: false # 服务注册,false表示不将自已注册到Eureka服务中
  6. fetchRegistry: false # 服务发现,false表示自己不从Eureka服务中获取注册信息
  7. serviceUrl: # Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自己(如果不配置则默认本机8761端口)
  8. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

关于yml文件,一定一定要注意缩进问题,否则会编译报错!

2.启动类EurekaServer_9000

  1. package com.zhrb.springcloud;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  6. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestParam;
  9. import org.springframework.web.bind.annotation.RestController;
  10. /**
  11. * @ClassName EurekaServer_9000
  12. * @Description TODO
  13. * @Author Administrator
  14. * @Date 2019/9/5 9:02
  15. * @Version
  16. */
  17. @RestController @EnableEurekaServer @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
  18. public class EurekaServer_9000 {
  19. public static void main(String[] args) {
  20. SpringApplication.run(EurekaServer_9000.class, args);
  21. }
  22. @Value("${server.port}")
  23. String port;
  24. @RequestMapping("/hi")
  25. public String home(@RequestParam String name) {
  26. return "hi "+name+",i am from port:" +port+"this is my first test eureka";
  27. }
  28. @RequestMapping("/shishi")
  29. public Object getNumber(){
  30. String s = "";
  31. for (int i=1;i<=9;i++){
  32. for (int j = 1;j<=i;j++){
  33. s+=i+"*"+j+"="+(i*j)+"\t";
  34. System.out.print(i+"*"+j+"="+(i*j)+"\t");
  35. }
  36. System.out.print("\n");
  37. }
  38. return s;
  39. }
  40. }

然后就是最重要的pom文件:

  1. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. 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. <parent>
  5. <artifactId>springcloud-demo-01</artifactId>
  6. <groupId>com.zrb.springcloud</groupId>
  7. <version>1.0-SNAPSHOT</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <artifactId>springclouddemo-05-eureka-9000</artifactId>
  11. <dependencies>
  12. <dependency>
  13. <groupId>org.springframework.cloud</groupId>
  14. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  15. <version>1.3.5.RELEASE</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-test</artifactId>
  20. <scope>test</scope>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-autoconfigure</artifactId>
  25. </dependency>
  26. <!--热部署-->
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-devtools</artifactId>
  30. <optional>true</optional>
  31. </dependency>
  32. </dependencies>
  33. <dependencyManagement>
  34. <dependencies>
  35. <dependency>
  36. <groupId>org.springframework.cloud</groupId>
  37. <artifactId>spring-cloud-dependencies</artifactId>
  38. <version>Finchley.SR2</version>
  39. <type>pom</type>
  40. <scope>import</scope>
  41. </dependency>
  42. </dependencies>
  43. </dependencyManagement>
  44. <build>
  45. <plugins>
  46. <plugin>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-maven-plugin</artifactId>
  49. </plugin>
  50. </plugins>
  51. </build>
  52. <repositories>
  53. <repository>
  54. <id>spring-milestones</id>
  55. <name>Spring Milestones</name>
  56. <url>https://repo.spring.io/milestone</url>
  57. <snapshots>
  58. <enabled>false</enabled>
  59. </snapshots>
  60. </repository>
  61. </repositories>
  62. </project>

然后启动项目后截图如下:
![Image 1][]
可以看到,此时是没有项目向注册中心注册的。
接下来改造8001,8002向注册中心注册。

改造8001,8002

改造两个项目,让两个项目向注册中心注册:
format_png 3

8001

改造后的pom如下:

  1. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. 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. <parent>
  5. <artifactId>springcloud-demo-01</artifactId>
  6. <groupId>com.zrb.springcloud</groupId>
  7. <version>1.0-SNAPSHOT</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <properties>
  11. <swagger.version>2.6.1</swagger.version>
  12. <swagger.ui.version>2.6.1</swagger.ui.version>
  13. </properties>
  14. <artifactId>springcloud-demo-03-provider-product-8001</artifactId>
  15. <dependencies>
  16. <!--springboot web启动器-->
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <!-- mybatis 启动器-->
  22. <dependency>
  23. <groupId>org.mybatis.spring.boot</groupId>
  24. <artifactId>mybatis-spring-boot-starter</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>junit</groupId>
  32. <artifactId>junit</artifactId>
  33. </dependency>
  34. <dependency>
  35. <groupId>mysql</groupId>
  36. <artifactId>mysql-connector-java</artifactId>
  37. </dependency>
  38. <dependency>
  39. <groupId>com.alibaba</groupId>
  40. <artifactId>druid</artifactId>
  41. </dependency>
  42. <dependency>
  43. <groupId>com.zrb.springcloud</groupId>
  44. <artifactId>springcloud-02-api</artifactId>
  45. <version>${project.version}</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.cloud</groupId>
  49. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  50. <version>1.3.5.RELEASE</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework.cloud</groupId>
  54. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  55. </dependency>
  56. <!--druid数据源-->
  57. <dependency>
  58. <groupId>com.alibaba</groupId>
  59. <artifactId>druid</artifactId>
  60. <version>${druid.version}</version>
  61. </dependency>
  62. <dependency>
  63. <groupId>mysql</groupId>
  64. <artifactId>mysql-connector-java</artifactId>
  65. <version>${mysql-connector-java.version}</version>
  66. </dependency>
  67. <dependency>
  68. <groupId>org.mybatis</groupId>
  69. <artifactId>mybatis-spring</artifactId>
  70. <version>2.0.0</version>
  71. </dependency>
  72. <!--导入 mybatis 启动器-->
  73. <dependency>
  74. <groupId>org.mybatis.spring.boot</groupId>
  75. <artifactId>mybatis-spring-boot-starter</artifactId>
  76. <version>${mybatis-spring-boot-starter.version}</version>
  77. </dependency>
  78. <!--lombok bean 生成辅助框架-->
  79. <dependency>
  80. <groupId>org.projectlombok</groupId>
  81. <artifactId>lombok</artifactId>
  82. <version>${lombok.version}</version>
  83. </dependency>
  84. <!--swagger 前后端分离调试用-->
  85. <dependency>
  86. <groupId>io.springfox</groupId>
  87. <artifactId>springfox-swagger2</artifactId>
  88. <version>${swagger.version}</version>
  89. </dependency>
  90. <dependency>
  91. <groupId>io.springfox</groupId>
  92. <artifactId>springfox-swagger-ui</artifactId>
  93. <version>${swagger.ui.version}</version>
  94. </dependency>
  95. </dependencies>
  96. <dependencyManagement>
  97. <dependencies>
  98. <dependency>
  99. <groupId>org.springframework.cloud</groupId>
  100. <artifactId>spring-cloud-dependencies</artifactId>
  101. <version>Finchley.SR2</version>
  102. <type>pom</type>
  103. <scope>import</scope>
  104. </dependency>
  105. </dependencies>
  106. </dependencyManagement>
  107. <build>
  108. <plugins>
  109. <plugin>
  110. <groupId>org.springframework.boot</groupId>
  111. <artifactId>spring-boot-maven-plugin</artifactId>
  112. </plugin>
  113. </plugins>
  114. </build>
  115. <repositories>
  116. <repository>
  117. <id>spring-milestones</id>
  118. <name>Spring Milestones</name>
  119. <url>https://repo.spring.io/milestone</url>
  120. <snapshots>
  121. <enabled>false</enabled>
  122. </snapshots>
  123. </repository>
  124. </repositories>
  125. </project>

application.yml如下:

  1. server:
  2. port: 8001
  3. mybatis:
  4. config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
  5. type-aliases-package: com.zhrb.springcloud.entity # 所有Entity别名类所在包
  6. mapper-locations: classpath:mybatis/mapper/**/*.xml # mapper映射文件 spring:
  7. application: name: springcloud-product #这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name datasource:
  8. type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
  9. driver-class-name: com.mysql.cj.jdbc.Driver # mysql驱动包
  10. url: jdbc:mysql://104.225.147.76:3306/springcloud_db01?serverTimezone=GMT%2B8 # 数据库名称
  11. username: root
  12. password: Zhrb1992!
  13. dbcp2:
  14. min-idle: 5 # 数据库连接池的最小维持连接数
  15. initial-size: 5 # 初始化连接数
  16. max-total: 5 # 最大连接数
  17. max-wait-millis: 150 # 等待连接获取的最大超时时间 eureka:
  18. client: serviceUrl: defaultZone: http://localhost:9000/eureka/

然后在启动类上增加@EnableEurekaClient 即可。

改造8002

pom

  1. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. 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. <parent>
  5. <artifactId>springcloud-demo-01</artifactId>
  6. <groupId>com.zrb.springcloud</groupId>
  7. <version>1.0-SNAPSHOT</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <artifactId>springclouddemo-04-consumer-product-8002</artifactId>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14. <java.version>1.8</java.version>
  15. <spring-cloud.version>Dalston.SR4</spring-cloud.version>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>com.zrb.springcloud</groupId>
  20. <artifactId>springcloud-02-api</artifactId>
  21. <version>${project.version}</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.cloud</groupId>
  25. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  26. <version>1.3.5.RELEASE</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.cloud</groupId>
  30. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-autoconfigure</artifactId>
  40. </dependency>
  41. <!--热部署-->
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-devtools</artifactId>
  45. <optional>true</optional>
  46. </dependency>
  47. </dependencies>
  48. <dependencyManagement>
  49. <dependencies>
  50. <dependency>
  51. <groupId>org.springframework.cloud</groupId>
  52. <artifactId>spring-cloud-dependencies</artifactId>
  53. <version>Finchley.SR2</version>
  54. <type>pom</type>
  55. <scope>import</scope>
  56. </dependency>
  57. </dependencies>
  58. </dependencyManagement>
  59. <build>
  60. <plugins>
  61. <plugin>
  62. <groupId>org.springframework.boot</groupId>
  63. <artifactId>spring-boot-maven-plugin</artifactId>
  64. </plugin>
  65. </plugins>
  66. </build>
  67. <repositories>
  68. <repository>
  69. <id>spring-milestones</id>
  70. <name>Spring Milestones</name>
  71. <url>https://repo.spring.io/milestone</url>
  72. <snapshots>
  73. <enabled>false</enabled>
  74. </snapshots>
  75. </repository>
  76. </repositories>
  77. </project>

application.yml

  1. server:
  2. port: 8002
  3. eureka:
  4. client: serviceUrl: defaultZone: http://localhost:9000/eureka/
  5. spring:
  6. application: name: consumer-product

然后在启动类上增加@EnableEurekaClient 即可。

注意,后面的spring-boot-maven-plugin,以及pring-cloud-dependencies是必须的,否则在client找不到指定的版本。

启动项目验证

注意项目的启动顺序,先启动服务中心,再启动其他服务注册。
即:9000->8001->8002
format_png 4
启动后可以看到两个项目都注册到了服务中心。

这里有一点,当我其中一个项目宕机时,注册中心依然能看到这个服务,这不太好啊,那怎么办呢?别急,后续的springcloud组件中有关于这点的处理,那就是服务的熔断机制。

,博主的微信公众号
程序员小圈圈’开始持续更新了哟~~
识别二维码或者直接搜索名字 ‘程序员小圈圈’ 即可关注本公众号哟~~
不只是有技术哟~~
还有很多的学习娱乐资源免费下载哦~~
还可以学下教育知识以及消遣娱乐哟~~
求关注哟~~ format_png 5

[Image 1]:

发表评论

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

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

相关阅读

    相关 SpringCloudEureka

    目录 一、eureka的作用 二、搭建Eureka服务端 三、添加客户端 四、服务发现 -------------------- 提供者与消费者 服务提供者:一次