【SpringCloud框架之Eureka服务注册与发现】

布满荆棘的人生 2023-09-24 23:16 132阅读 0赞

本笔记内容为尚硅谷SpringCloud框架开发Eureka部分

目录

一、微服务架构编码构建

1、微服务cloud整体聚合父工程Project

创建步骤

2、创建一个公共Module

3、Rest微服务工程构建

1.cloud-provider-payment8001微服务提供者支付Module模块

2、热部署Devtools

3、cloud-consumer-order80微服务消费者订单Module模块

二、Eureka服务注册与发现

1、Eureka基础知识

2、单机Eureka构建步骤

1.生成eurekaServer端服务注册中心

2.EurekaClient端cloud-provider-payment8001

3.EurekaClient端cloud-consumer-order80

3、集群Eureka构建步骤

1.Eureka集群原理说明

2.EurekaServer集群环境构建步骤

3.支付服务提供者8001集群环境构建

4.负载均衡

5.actuator微服务信息完善

6.服务发现Discovery

7.Eureka自我保护


一、微服务架构编码构建


1、微服务cloud整体聚合父工程Project

创建步骤

  1. New Project

4c18de98b4814bce8b3c666f9d27ec83.png

  1. 聚合总父工程名字

0edf700e3d8c476882f075e0e107db99.png

  1. Maven选版本

9b033686bfff456d94752bcf97490160.png

  1. 工程名字

40449437ec3b4226a1e91eac59b00cd1.png

  1. 字符编码

34239ef3a9d441199c4fcc1e6115b3b4.png

  1. 注解生效激活

98ae6c2947534c188abe5de244100b2a.png

  1. java编译版本选8

b45a7afdf6a046f78130670af48810b8.png

  1. File Type过滤

b1ee5a9a978342c0b44e0ba19aa08f90.png

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>com.atguigu.springcloud</groupId>
  6. <artifactId>mscloud03</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>pom</packaging>
  9. <!-- 统一管理jar包版本 -->
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <maven.compiler.source>1.8</maven.compiler.source>
  13. <maven.compiler.target>1.8</maven.compiler.target>
  14. <junit.version>4.12</junit.version>
  15. <log4j.version>1.2.17</log4j.version>
  16. <lombok.version>1.16.18</lombok.version>
  17. <mysql.version>5.1.47</mysql.version>
  18. <druid.version>1.1.16</druid.version>
  19. <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
  20. </properties>
  21. <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
  22. <dependencyManagement>
  23. <dependencies>
  24. <!--spring boot 2.2.2-->
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-dependencies</artifactId>
  28. <version>2.2.2.RELEASE</version>
  29. <type>pom</type>
  30. <scope>import</scope>
  31. </dependency>
  32. <!--spring cloud Hoxton.SR1-->
  33. <dependency>
  34. <groupId>org.springframework.cloud</groupId>
  35. <artifactId>spring-cloud-dependencies</artifactId>
  36. <version>Hoxton.SR1</version>
  37. <type>pom</type>
  38. <scope>import</scope>
  39. </dependency>
  40. <!--spring cloud alibaba 2.1.0.RELEASE-->
  41. <dependency>
  42. <groupId>com.alibaba.cloud</groupId>
  43. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  44. <version>2.1.0.RELEASE</version>
  45. <type>pom</type>
  46. <scope>import</scope>
  47. </dependency>
  48. <dependency>
  49. <groupId>mysql</groupId>
  50. <artifactId>mysql-connector-java</artifactId>
  51. <version>${mysql.version}</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>com.alibaba</groupId>
  55. <artifactId>druid</artifactId>
  56. <version>${druid.version}</version>
  57. </dependency>
  58. <dependency>
  59. <groupId>org.mybatis.spring.boot</groupId>
  60. <artifactId>mybatis-spring-boot-starter</artifactId>
  61. <version>${mybatis.spring.boot.version}</version>
  62. </dependency>
  63. <dependency>
  64. <groupId>junit</groupId>
  65. <artifactId>junit</artifactId>
  66. <version>${junit.version}</version>
  67. </dependency>
  68. <dependency>
  69. <groupId>log4j</groupId>
  70. <artifactId>log4j</artifactId>
  71. <version>${log4j.version}</version>
  72. </dependency>
  73. <dependency>
  74. <groupId>org.projectlombok</groupId>
  75. <artifactId>lombok</artifactId>
  76. <version>${lombok.version}</version>
  77. <optional>true</optional>
  78. </dependency>
  79. </dependencies>
  80. </dependencyManagement>
  81. <build>
  82. <plugins>
  83. <plugin>
  84. <groupId>org.springframework.boot</groupId>
  85. <artifactId>spring-boot-maven-plugin</artifactId>
  86. <configuration>
  87. <fork>true</fork>
  88. <addResources>true</addResources>
  89. </configuration>
  90. </plugin>
  91. </plugins>
  92. </build>
  93. </project>

父工程创建完成执行mvn:install将父工程发布到仓库方便子工程继承

mysql驱动说明

com.mysql.jdbc.Driver和mysql-connector-java 5一起用。

com.mysql.cj.jdbc.Driver和mysql-connector-java 6 一起用。

com.mysql.cj.jdbc.Driver是mysql-connector-java 6 中的特性,相比mysql-connector-java 5 多了一个时区:serverTimezone,把数据源配置的驱动改一下就好了

org.gjt.mm.mysql.Driver是当时最好的MySQL JDBC,但不是MySQL公司的,然后MySQL将MM的JDBC驱动 收为官方的JDBC驱动,所以将驱动的package也改了,但还保留了org.gjt.mm.mysql.Driver这个路径的引用,也就是你使用新版的JDBC驱动时还可以通过这个来引用,打开下载的新版JDBC驱动的jar文件可以看到,只有一个文件的目录是org.gjt.mm.mysql,就是为了兼容而设计的。

2、创建一个公共Module


1.新建一个Module:cloud-api-commons

2.POM

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>mscloud03</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-api-commons</artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-devtools</artifactId>
  16. <scope>runtime</scope>
  17. <optional>true</optional>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.projectlombok</groupId>
  21. <artifactId>lombok</artifactId>
  22. <optional>true</optional>
  23. </dependency>
  24. <dependency>
  25. <groupId>cn.hutool</groupId>
  26. <artifactId>hutool-all</artifactId>
  27. <version>5.1.0</version>
  28. </dependency>
  29. </dependencies>
  30. </project>

3.entities包下

Payment实体

  1. package com.atguigu.springcloud.entities;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.io.Serializable;
  6. @Data
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. public class Payment implements Serializable
  10. {
  11. private Long id;
  12. private String serial;
  13. }

CommonResult通用封装类

  1. package com.atguigu.springcloud.entities;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class CommonResult<T>
  9. {
  10. private Integer code;
  11. private String message;
  12. private T data;
  13. public CommonResult(Integer code, String message)
  14. {
  15. this(code,message,null);
  16. }
  17. }

4.maven命令clean install

df9f46858b7a4067b3b4c99ab55a9731.png

在要用到的模块引用依赖即可

  1. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  2. <groupId>com.atguigu.springcloud</groupId>
  3. <artifactId>cloud-api-commons</artifactId>
  4. <version>${project.version}</version>
  5. </dependency>

3、Rest微服务工程构建


1.cloud-provider-payment8001微服务提供者支付Module模块

步骤

新建Module:cloud-provider-payment8001

改POM

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>mscloud03</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-consumer-order80</artifactId>
  12. <dependencies>
  13. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  14. <groupId>com.atguigu.springcloud</groupId>
  15. <artifactId>cloud-api-commons</artifactId>
  16. <version>${project.version}</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-web</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-actuator</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-devtools</artifactId>
  29. <scope>runtime</scope>
  30. <optional>true</optional>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.projectlombok</groupId>
  34. <artifactId>lombok</artifactId>
  35. <optional>true</optional>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-test</artifactId>
  40. <scope>test</scope>
  41. </dependency>
  42. </dependencies>
  43. </project>

写YML

  1. server:
  2. port: 8001
  3. spring:
  4. application:
  5. name: cloud-payment-service
  6. datasource:
  7. type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
  8. driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包 com.mysql.jdbc.Driver
  9. url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false
  10. username: root
  11. password: 123456
  12. mybatis:
  13. mapperLocations: classpath:mapper/*.xml
  14. type-aliases-package: com.atguigu.springcloud.entities # 所有Entity别名类所在包

新建主启动类

  1. package com.atguigu.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. /**
  5. * @auther zzyy
  6. * @create 2020-01-27 19:50
  7. */
  8. @SpringBootApplication
  9. public class PaymentMain8001
  10. {
  11. public static void main(String[] args)
  12. {
  13. SpringApplication.run(PaymentMain8001.class,args);
  14. }
  15. }

业务类

  1. 建表SQL

    CREATE TABLE payment (

    id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘ID’,

    serial varchar(200) DEFAULT ‘’,

    PRIMARY KEY (id)

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

  2. dao

接口PaymentDao

  1. package com.atguigu.springcloud.dao;
  2. import com.atguigu.springcloud.entities.Payment;
  3. import org.apache.ibatis.annotations.Mapper;
  4. @Mapper //import org.apache.ibatis.annotations.Mapper;
  5. public interface PaymentDao
  6. {
  7. public int create(Payment payment);
  8. public Payment getPaymentById(@Param("id") Long id);
  9. }

mybaits的映射文件PaymentMapper.xml (src\main\resources\mapper\PaymentMapper.xml)

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.atguigu.springcloud.dao.PaymentDao">
  4. <resultMap id="BaseResultMap" type="com.atguigu.springcloud.entities.Payment">
  5. <id column="id" property="id" jdbcType="BIGINT"/>
  6. <result column="serial" property="serial" jdbcType="VARCHAR"/>
  7. </resultMap>
  8. <insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">
  9. INSERT INTO payment(SERIAL) VALUES(#{serial});
  10. </insert>
  11. <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap" >
  12. SELECT * FROM payment WHERE id=#{id};
  13. </select>
  14. </mapper>

3.service

接口PaymentService

  1. package com.atguigu.springcloud.service;
  2. import com.atguigu.springcloud.entities.Payment;
  3. import org.apache.ibatis.annotations.Param;
  4. public interface PaymentService
  5. {
  6. public int create(Payment payment);
  7. public Payment getPaymentById(@Param("id") Long id);
  8. }

实现类PaymentServiceImpl.java

  1. package com.atguigu.springcloud.service.impl;
  2. import com.atguigu.springcloud.dao.PaymentDao;
  3. import com.atguigu.springcloud.entities.Payment;
  4. import com.atguigu.springcloud.service.PaymentService;
  5. import org.springframework.stereotype.Service;
  6. import javax.annotation.Resource;
  7. @Service
  8. public class PaymentServiceImpl implements PaymentService
  9. {
  10. @Resource
  11. private PaymentDao paymentDao;
  12. @Override
  13. public int create(Payment payment)
  14. {
  15. return paymentDao.create(payment);
  16. }
  17. @Override
  18. public Payment getPaymentById(Long id)
  19. {
  20. return paymentDao.getPaymentById(id);
  21. }
  22. }

4.controller

  1. package com.atguigu.springcloud.controller;
  2. import com.atguigu.springcloud.entities.CommonResult;
  3. import com.atguigu.springcloud.entities.Payment;
  4. import com.atguigu.springcloud.service.PaymentService;
  5. import com.sun.media.jfxmedia.logging.Logger;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.web.bind.annotation.*;
  8. import javax.annotation.Resource;
  9. /**
  10. * @auther zzyy
  11. * @create 2020-01-27 21:17
  12. */
  13. @RestController
  14. @Slf4j
  15. public class PaymentController
  16. {
  17. @Resource
  18. private PaymentService paymentService;
  19. @PostMapping(value = "/payment/create")
  20. public CommonResult create(@RequestBody Payment payment)
  21. {
  22. int result = paymentService.create(payment);
  23. log.info("*****插入操作返回结果:" + result);
  24. if(result > 0)
  25. {
  26. return new CommonResult(200,"插入数据库成功",result);
  27. }else{
  28. return new CommonResult(444,"插入数据库失败",null);
  29. }
  30. }
  31. @GetMapping(value = "/payment/get/{id}")
  32. public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
  33. {
  34. Payment payment = paymentService.getPaymentById(id);
  35. log.info("*****查询结果:{}",payment);
  36. if (payment != null) {
  37. return new CommonResult(200,"查询成功",payment);
  38. }else{
  39. return new CommonResult(444,"没有对应记录,查询ID: "+id,null);
  40. }
  41. }
  42. }

535605b909f6413b9b10fa1d34946134.png

2、热部署Devtools


添加依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-devtools</artifactId>
  4. <scope>runtime</scope>
  5. <optional>true</optional>
  6. </dependency>

下段配置我们粘贴进聚合父类总工程的pom.xml里

  1. <!--打包插件-->
  2. <build>
  3. <finalName>你自己的工程名字</finalName>
  4. <plugins>
  5. <plugin>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-maven-plugin</artifactId>
  8. <configuration>
  9. <fork>true</fork>
  10. <addResources>true</addResources>
  11. </configuration>
  12. </plugin>
  13. </plugins>
  14. </build>

设置IDEA

059052158b9145f2adc5e4e2dd425437.png

b7150e341e2243c0ba38ff53159b6a07.png

最后重启生效

3、cloud-consumer-order80微服务消费者订单Module模块


1.新建cloud-consumer-order80

2.POM

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>cloud190805</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-consumer-order80</artifactId>
  12. <dependencies>
  13. <dependency>
  14. <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  15. <groupId>com.atguigu.springcloud</groupId>
  16. <artifactId>cloud-api-commons</artifactId>
  17. <version>${project.version}</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-actuator</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-devtools</artifactId>
  30. <scope>runtime</scope>
  31. <optional>true</optional>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.projectlombok</groupId>
  35. <artifactId>lombok</artifactId>
  36. <optional>true</optional>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-starter-test</artifactId>
  41. <scope>test</scope>
  42. </dependency>
  43. </dependencies>
  44. </project>

3.写YML

  1. server:
  2. port: 80

4.新建主启动类

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

5.业务类

RestTemplate

RestTemplate提供了多种便捷访问远程Http服务的方法, 是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集

官网地址

https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html

使用

使用restTemplate访问restful接口非常的简单粗暴无脑。

(url, requestMap, ResponseBean.class)这三个参数分别代表

REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。

6.config配置类ApplicationContextConfig

  1. package com.atguigu.springcloud.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.client.RestTemplate;
  5. @Configuration
  6. public class ApplicationContextConfig
  7. {
  8. @Bean
  9. public RestTemplate restTemplate()
  10. {
  11. return new RestTemplate();
  12. }
  13. }

7.Controller类

  1. package com.atguigu.springcloud.controller;
  2. import com.atguigu.springcloud.entities.CommonResult;
  3. import com.atguigu.springcloud.entities.Payment;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.client.RestTemplate;
  9. @RestController
  10. public class OrderController
  11. {
  12. public static final String PaymentSrv_URL = "http://localhost:8001";
  13. @Autowired
  14. private RestTemplate restTemplate;
  15. @GetMapping("/consumer/payment/create") //客户端用浏览器是get请求,但是底层实质发送post调用服务端8001
  16. public CommonResult create(Payment payment)
  17. {
  18. return restTemplate.postForObject(PaymentSrv_URL + "/payment/create",payment,CommonResult.class);
  19. }
  20. @GetMapping("/consumer/payment/get/{id}")
  21. public CommonResult getPayment(@PathVariable Long id)
  22. {
  23. return restTemplate.getForObject(PaymentSrv_URL + "/payment/get/"+id, CommonResult.class, id);
  24. }
  25. }

86c858cb5de74568916eaf474564e742.png

9a84040e87b64fc59cc3246bd40acc18.png

二、Eureka服务注册与发现


1、Eureka基础知识

什么是服务治理  

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理

在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。

什么是服务注册与发现

Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。

在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))

54ad422a3f574a2c984394f36becf272.png

Eureka包含两个组件:Eureka Server和Eureka Client

Eureka Server提供服务注册服务

各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。

EurekaClient通过注册中心进行访问

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

2、单机Eureka构建步骤


1.生成eurekaServer端服务注册中心

步骤

建Module:cloud-eureka-server7001

改POM

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>mscloud03</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-eureka-server7001</artifactId>
  12. <dependencies>
  13. <!--eureka-server-->
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  17. </dependency>
  18. <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  19. <dependency>
  20. <groupId>com.atguigu.springcloud</groupId>
  21. <artifactId>cloud-api-commons</artifactId>
  22. <version>${project.version}</version>
  23. </dependency>
  24. <!--boot web actuator-->
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-actuator</artifactId>
  32. </dependency>
  33. <!--一般通用配置-->
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-devtools</artifactId>
  37. <scope>runtime</scope>
  38. <optional>true</optional>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.projectlombok</groupId>
  42. <artifactId>lombok</artifactId>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-test</artifactId>
  47. <scope>test</scope>
  48. </dependency>
  49. <dependency>
  50. <groupId>junit</groupId>
  51. <artifactId>junit</artifactId>
  52. </dependency>
  53. </dependencies>
  54. </project>

写YML

  1. server:
  2. port: 7001
  3. eureka:
  4. instance:
  5. hostname: localhost #eureka服务端的实例名称
  6. client:
  7. #false表示不向注册中心注册自己。
  8. register-with-eureka: false
  9. #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
  10. fetch-registry: false
  11. service-url:
  12. #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
  13. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

主启动

  1. package com.atguigu.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. @SpringBootApplication
  6. @EnableEurekaServer
  7. public class EurekaMain7001
  8. {
  9. public static void main(String[] args)
  10. {
  11. SpringApplication.run(EurekaMain7001.class,args);
  12. }
  13. }

测试http://localhost:7001/

No application available 没有服务被发现O(∩_∩)O因为没有注册服务进来当然不可能有服务被发现

cb20181f0ff04ed18ce9d5b2953f3a52.png

#

2.EurekaClient端cloud-provider-payment8001


将注册进EurekaServer成为服务提供者provider

建Module:cloud-provider-payment8001

改POM

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>mscloud03</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-provider-payment8001</artifactId>
  12. <dependencies>
  13. <!--eureka-client-->
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  17. </dependency>
  18. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  19. <groupId>com.atguigu.springcloud</groupId>
  20. <artifactId>cloud-api-commons</artifactId>
  21. <version>${project.version}</version>
  22. </dependency>
  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-actuator</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.mybatis.spring.boot</groupId>
  33. <artifactId>mybatis-spring-boot-starter</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>com.alibaba</groupId>
  37. <artifactId>druid-spring-boot-starter</artifactId>
  38. <version>1.1.10</version>
  39. </dependency>
  40. <!--mysql-connector-java-->
  41. <dependency>
  42. <groupId>mysql</groupId>
  43. <artifactId>mysql-connector-java</artifactId>
  44. </dependency>
  45. <!--jdbc-->
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-jdbc</artifactId>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-devtools</artifactId>
  53. <scope>runtime</scope>
  54. <optional>true</optional>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.projectlombok</groupId>
  58. <artifactId>lombok</artifactId>
  59. <optional>true</optional>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework.boot</groupId>
  63. <artifactId>spring-boot-starter-test</artifactId>
  64. <scope>test</scope>
  65. </dependency>
  66. </dependencies>
  67. </project>

写YML

  1. server:
  2. port: 8001
  3. spring:
  4. application:
  5. name: cloud-payment-service
  6. datasource:
  7. type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
  8. driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
  9. url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false
  10. username: root
  11. password: 123456
  12. eureka:
  13. client:
  14. #表示是否将自己注册进EurekaServer默认为true。
  15. register-with-eureka: true
  16. #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
  17. fetchRegistry: true
  18. service-url:
  19. defaultZone: http://localhost:7001/eureka
  20. mybatis:
  21. mapperLocations: classpath:mapper/*.xml
  22. type-aliases-package: com.atguigu.springcloud.entities # 所有Entity别名类所在包

主启动

  1. package com.atguigu.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. /**
  6. * @auther zzyy
  7. * @create 2020-01-27 19:50
  8. */
  9. @SpringBootApplication
  10. @EnableEurekaClient
  11. public class PaymentMain8001
  12. {
  13. public static void main(String[] args)
  14. {
  15. SpringApplication.run(PaymentMain8001.class,args);
  16. }
  17. }

测试

先要启动EurekaServer

访问http://localhost:7001/

b34d17a553484206bd62dc16a6f41b54.png

微服务注册名配置说明

f121e0e4d0424388811b2b620eec5bcd.png

自我保护机制

cc0bceef5c1746738875eb0699216027.png

#

3.EurekaClient端cloud-consumer-order80


将注册进EurekaServer成为服务消费者consumer

建Module:cloud-consumer-order80

POM

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>mscloud03</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-consumer-order80</artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  16. </dependency>
  17. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  18. <groupId>com.atguigu.springcloud</groupId>
  19. <artifactId>cloud-api-commons</artifactId>
  20. <version>${project.version}</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-actuator</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-devtools</artifactId>
  33. <scope>runtime</scope>
  34. <optional>true</optional>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.projectlombok</groupId>
  38. <artifactId>lombok</artifactId>
  39. <optional>true</optional>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-starter-test</artifactId>
  44. <scope>test</scope>
  45. </dependency>
  46. </dependencies>
  47. </project>

YML

  1. server:
  2. port: 80
  3. spring:
  4. application:
  5. name: cloud-order-service
  6. eureka:
  7. client:
  8. #表示是否将自己注册进EurekaServer默认为true。
  9. register-with-eureka: true
  10. #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
  11. fetchRegistry: true
  12. service-url:
  13. defaultZone: http://localhost:7001/eureka

主启动

  1. package com.atguigu.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. @SpringBootApplication
  6. @EnableEurekaClient
  7. public class OrderMain80
  8. {
  9. public static void main(String[] args)
  10. {
  11. SpringApplication.run(OrderMain80.class,args);
  12. }
  13. }

测试

先要启动EurekaServer,7001服务

再要启动服务提供者provider,8001服务

eureka服务器

75ed44d4367b44ae8fec32240409655f.png

http://localhost/consumer/payment/get/31

注意:YML层次缩进和空格不能少

#

3、集群Eureka构建步骤


1.Eureka集群原理说明


c41135b44d874750b0bc109705a31b89.png

#

2.EurekaServer集群环境构建步骤


参考cloud-eureka-server7001

新建Module:cloud-eureka-server7002

改POM

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>mscloud03</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-eureka-server7002</artifactId>
  12. <dependencies>
  13. <!--eureka-server-->
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  17. </dependency>
  18. <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  19. <dependency>
  20. <groupId>com.atguigu.springcloud</groupId>
  21. <artifactId>cloud-api-commons</artifactId>
  22. <version>${project.version}</version>
  23. </dependency>
  24. <!--boot web actuator-->
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-actuator</artifactId>
  32. </dependency>
  33. <!--一般通用配置-->
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-devtools</artifactId>
  37. <scope>runtime</scope>
  38. <optional>true</optional>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.projectlombok</groupId>
  42. <artifactId>lombok</artifactId>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-test</artifactId>
  47. <scope>test</scope>
  48. </dependency>
  49. <dependency>
  50. <groupId>junit</groupId>
  51. <artifactId>junit</artifactId>
  52. </dependency>
  53. </dependencies>
  54. </project>

修改映射配置

c705f79c1a9e4d7bb85ec4541453dd9a.png

写YML(以前单机)

a4fd437dc78f457c9d97a9c1162757e2.png

7001现在

  1. server:
  2. port: 7001
  3. eureka:
  4. instance:
  5. hostname: eureka7001.com #eureka服务端的实例名称
  6. client:
  7. register-with-eureka: false #false表示不向注册中心注册自己。
  8. fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
  9. service-url:
  10. defaultZone: http://eureka7002.com:7002/eureka/

7002现在

  1. server:
  2. port: 7002
  3. eureka:
  4. instance:
  5. hostname: eureka7002.com #eureka服务端的实例名称
  6. client:
  7. register-with-eureka: false #false表示不向注册中心注册自己。
  8. fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
  9. service-url:
  10. defaultZone: http://eureka7001.com:7001/eureka/

主启动

  1. package com.atguigu.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. @SpringBootApplication
  6. @EnableEurekaServer
  7. public class EurekaMain7002
  8. {
  9. public static void main(String[] args)
  10. {
  11. SpringApplication.run(EurekaMain7002.class,args);
  12. }
  13. }

将支付服务8001微服务发布到上面2台Eureka集群配置中:YML

defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka # 集群版

e7e2fe0a513344d9b19f765a806eb6e0.png

将订单服务80微服务发布到上面2台Eureka集群配置中:YML

eureka:
client:

#表示是否将自己注册进EurekaServer默认为true**。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon**使用负载均衡
fetchRegistry: true
service-url:

#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka # 集群版

a94a2b88748e4addbe46d55c07880e28.png

测试

先要启动EurekaServer,7001/7002服务

再要启动服务提供者provider,8001

再要启动消费者,80

访问:http://localhost/consumer/payment/get/31

#

3.支付服务提供者8001集群环境构建


参考cloud-provider-payment8001

新建cloud-provider-payment8002

改POM

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>mscloud03</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-provider-payment8002</artifactId>
  12. <dependencies>
  13. <!--eureka-client-->
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  17. </dependency>
  18. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  19. <groupId>com.atguigu.springcloud</groupId>
  20. <artifactId>cloud-api-commons</artifactId>
  21. <version>${project.version}</version>
  22. </dependency>
  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-actuator</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.mybatis.spring.boot</groupId>
  33. <artifactId>mybatis-spring-boot-starter</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>com.alibaba</groupId>
  37. <artifactId>druid-spring-boot-starter</artifactId>
  38. <version>1.1.10</version>
  39. </dependency>
  40. <!--mysql-connector-java-->
  41. <dependency>
  42. <groupId>mysql</groupId>
  43. <artifactId>mysql-connector-java</artifactId>
  44. </dependency>
  45. <!--jdbc-->
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-jdbc</artifactId>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-devtools</artifactId>
  53. <scope>runtime</scope>
  54. <optional>true</optional>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.projectlombok</groupId>
  58. <artifactId>lombok</artifactId>
  59. <optional>true</optional>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework.boot</groupId>
  63. <artifactId>spring-boot-starter-test</artifactId>
  64. <scope>test</scope>
  65. </dependency>
  66. </dependencies>
  67. </project>

写YML

defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka # 集群版

3481177dd05c47c783748026fbd967c7.png

主启动

  1. package com.atguigu.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. @SpringBootApplication
  6. @EnableEurekaClient
  7. public class PaymentMain8002
  8. {
  9. public static void main(String[] args)
  10. {
  11. SpringApplication.run(PaymentMain8002.class,args);
  12. }
  13. }

业务类

直接从8001粘

修改Controller

8001

  1. package com.atguigu.springcloud.controller;
  2. import com.atguigu.springcloud.entities.CommonResult;
  3. import com.atguigu.springcloud.entities.Payment;
  4. import com.atguigu.springcloud.service.PaymentService;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.web.bind.annotation.*;
  8. import javax.annotation.Resource;
  9. @RestController
  10. @Slf4j
  11. public class PaymentController
  12. {
  13. @Value("${server.port}")
  14. private String serverPort;
  15. @Resource
  16. private PaymentService paymentService;
  17. @PostMapping(value = "/payment/create")
  18. public CommonResult create(@RequestBody Payment payment)
  19. {
  20. int result = paymentService.create(payment);
  21. log.info("*****插入操作返回结果:" + result);
  22. if(result > 0)
  23. {
  24. return new CommonResult(200,"插入成功,返回结果"+result+"\t 服务端口:"+serverPort,payment);
  25. }else{
  26. return new CommonResult(444,"插入失败",null);
  27. }
  28. }
  29. @GetMapping(value = "/payment/get/{id}")
  30. public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
  31. {
  32. Payment payment = paymentService.getPaymentById(id);
  33. log.info("*****查询结果:{}",payment);
  34. if (payment != null) {
  35. return new CommonResult(200,"查询成功"+"\t 服务端口:"+serverPort,payment);
  36. }else{
  37. return new CommonResult(444,"没有对应记录,查询ID: "+id,null);
  38. }
  39. }
  40. }

8002

  1. package com.atguigu.springcloud.controller;
  2. import com.atguigu.springcloud.entities.CommonResult;
  3. import com.atguigu.springcloud.entities.Payment;
  4. import com.atguigu.springcloud.service.PaymentService;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.web.bind.annotation.*;
  8. import javax.annotation.Resource;
  9. @RestController
  10. @Slf4j
  11. public class PaymentController
  12. {
  13. @Value("${server.port}")
  14. private String serverPort;
  15. @Resource
  16. private PaymentService paymentService;
  17. @PostMapping(value = "/payment/create")
  18. public CommonResult create(@RequestBody Payment payment)
  19. {
  20. int result = paymentService.create(payment);
  21. log.info("*****新增结果:" + result);
  22. if(result > 0)
  23. {
  24. return new CommonResult(200,"插入成功,返回结果"+result+"\t 服务端口:"+serverPort,payment);
  25. }else{
  26. return new CommonResult(444,"插入失败",null);
  27. }
  28. }
  29. @GetMapping(value = "/payment/get/{id}")
  30. public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
  31. {
  32. Payment payment = paymentService.getPaymentById(id);
  33. log.info("*****查询结果:{}",payment);
  34. if (payment != null) {
  35. return new CommonResult(200,"查询成功"+"\t 服务端口:"+serverPort,payment);
  36. }else{
  37. return new CommonResult(444,"没有对应记录,查询ID: "+id,null);
  38. }
  39. }
  40. }

#

4.负载均衡


消费者cloud-consumer-order80
OrderController访问不能写死

  1. //public static final String PaymentSrv_URL = "http://localhost:8001";
  2. // 通过在eureka上注册过的微服务名称调用
  3. public static final String PaymentSrv_URL = "http://CLOUD-PAYMENT-SERVICE";

使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

ApplicationContextBean

  1. @Configuration
  2. public class ApplicationContextBean
  3. {
  4. @Bean
  5. @LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
  6. public RestTemplate getRestTemplate()
  7. {
  8. return new RestTemplate();
  9. }
  10. }

3816572164e04e9bbf10253ff43d7e0b.png

#

5.actuator微服务信息完善


主机名称:服务名称修改

62e27a9eaef64169aa104a7e2347be74.png

修改cloud-provider-payment8001:YML

  1. instance:
  2. instance-id: payment8001

50b9cc68327449a7823f47d1e5e16488.png

访问信息有IP信息提示

没有IP显示

修改cloud-provider-payment8001:YML

  1. prefer-ip-address: true #访问路径可以显示IP地址

" class="reference-link">a92ec9cf3e6445e19ecdf909c1a8a02c.png

6.服务发现Discovery


对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息

修改cloud-provider-payment8001的Controller

  1. @Resource
  2. private DiscoveryClient discoveryClient;
  3. @GetMapping(value = "/payment/discovery")
  4. public Object discovery()
  5. {
  6. //查看有Eureka有什么服务
  7. List<String> services = discoveryClient.getServices();
  8. for (String element : services) {
  9. System.out.println(element);
  10. }
  11. //查看CLOUD-PAYMENT-SERVICE名称下有什么实例
  12. List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
  13. for (ServiceInstance element : instances) {
  14. System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"
  15. + element.getUri());
  16. }
  17. return this.discoveryClient;
  18. }

8001主启动类

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @EnableDiscoveryClient //服务发现
  4. public class PaymentMain8001
  5. {
  6. public static void main(String[] args)
  7. {
  8. SpringApplication.run(PaymentMain8001.class,args);
  9. }
  10. }

d5de45bd89db440b8777a10acda9412d.png

#

7.Eureka自我保护


故障现象

2458ed5328bb4135b7a7b711167f6d36.png

导致原因

为什么会产生Eureka自我保护机制?

为了防止EurekaClient可以正常运行,但是 与 EurekaServer网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除

什么是自我保护模式?

默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。

0cad3b373ef64625ae03012327c4bfa1.png

怎么禁止自我保护

注册中心eureakeServer端7001

修改YML

使用eureka.server.enable-self-preservation = false 可以禁用自我保护模式

bce1a582a30b4db3a4763cd3c5595705.png

关闭效果

e56055140646442bbfc952ccfba2fe5c.png

生产者客户端eureakeClient端8001

  1. #心跳检测与续约时间
  2. #开发时设置小些,保证服务关闭后注册中心能即使剔除服务
  3. instance:
  4. #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
  5. lease-renewal-interval-in-seconds: 1
  6. #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
  7. lease-expiration-duration-in-seconds: 2

4ac8646a75e44cff9ee076ecff272f80.png

0beda5602973453f9db6dd96a3f95cf9.png

发表评论

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

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

相关阅读