最新版SpringCloud(H版&alibaba)

    技术2026-08-03  3

    内容: 感谢原创:花心思整理此脑图,此处分享让更多人看见 https://www.processon.com/view/link/5e6b6342e4b0e3993b62db71#map 源码地址: https://github.com/zhengsh/ssm-laboratory

    目录

    1、初识SpringCloud1.1、简介 2、SpringCloud升级,部分组件停用:3、环境搭建:3.1、创建父工程,pom依赖3.2、创建子模块3.3、pom依赖3.4、创建application.yml3.5、主启动类3.6、业务类3.7、测试 4、热部署5、order模块6、api模块7、服务注册与发现Eureka:7.1、环境搭建7.2、将微服务工程注册进Eureka7.3、Eureka集群7.3.1、核心原理7.3.2、搭建集群7.3.3、微服务注册进集群7.3.4、新增微服务,模拟负载均衡 7.4、actuator微服务信息完善7.5、服务发现Discovery7.6、Eureka自我保护机制7.6.1、关闭自我保护机制 7.7、Eureka停更说明 8、Consul服务注册与发现8.1、简介8.2、安装并运行Consul8.3、测试 9、注册中心异同点10、Ribbon负载均衡服务调用10.1、概述10.2、Ribbon负载均衡演示10.3、Ribbon核心组件IRule10.4、Ribbon负载均衡算法10.4.1、手写本地负载均衡器 11、OpenFeign服务接口调用11.1、概述11.2、OpenFeign使用步骤11.3、OpenFeign超时控制11.4、OpenFeign日志打印功能 12、Hystrix断路器12.1、概述12.2、Hystrix重要概念12.3、hystrix案例12.3.1、入门测试12.3.2、高并发测试12.3.2.1、Jmeter压测测试12.3.2.2、新建模块再测试 12.4、服务降级12.4.1、单局测试12.4.2、全局测试 12.5、服务熔断12.5.1、断路器12.5.2、熔断是什么12.5.3、实操12.5.4、原理(小总结) 12.6、hystrix工作流程12.7、服务监控hystrixDashboard 13、Gateway新一代网关(替换zuul)13.1、概述简介13.2、三大核心概念13.3、Gateway工作流程13.4、入门配置13.5、通过微服务名实现动态路由13.6、Predicate的使用13.7、Filter的使用 14、SpringCloud config分布式配置中心14.1、概述14.2、Config服务端配置与测试14.3、Config客户端配置与测试14.4、Config客户端之动态刷新 15、SpringCloud Bus 消息总线15.1、概述15.2、RabbitMQ环境配置15.3、SpringCloud Bus动态刷新全局广播15.4、SpringCloud Bus动态刷新定点通知 16、SpringCloud Stream消息驱动16.1、消息驱动概述16.2、案例说明16.3、消息驱动之生产者16.4、消息驱动之消费者16.5、分组消费与持久化 17、SpringCloud Sleuth分布式请求链路追踪17.1、概述17.2、搭建链路监控步骤 18、SpringCloud Alibaba入门简介19、SpringCloud Alibaba Nacos服务注册和配置中心19.1、Nacos简介19.2、安装并运行Nacos19.3、Nacos作为服务注册中心演示19.4、Nacos作为服务配置中心演示19.5、Nacos集群和持久化配置(重要)19.5.1、官网说明19.5.2、Nacos持久化配置解释19.5.3、Linux版Nacos+MySQL生产环境配置 20、SpringCloud Alibaba Sentinel实现熔断与限流20.1、Sentinel简介20.2、安装Sentinel控制台20.3、初始化演示工程20.4、流控规则20.5、降级规则20.6、热点key限流20.7、系统规则20.8、@SentinelResource20.9、服务熔断功能20.9.1、Ribbon系列20.9.2、Feign系列 20.10、规则持久化 21、SpringCloud Alibaba Seata处理分布式事务21.1、分布式事务问题21.2、Seata简介21.3、Seata-Server安装与配置21.4、订单/库存/账户业务数据库准备21.5、订单/库存/账户业务微服务准备21.5.1、新建订单Order-Module21.5.2、新建库存Storage-Module21.5.3、新建账户Account-Module21.5.4、Test 21.6、Seata之原理

    1、初识SpringCloud

    微服务是一种架构方式,最终肯定需要技术架构去实施。

    微服务的实现方式很多,但是最火的莫过于Spring Cloud了。为什么?

    后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大。技术强:Spring作为Java领域的前辈,可以说是功力深厚。有强力的技术团队支撑,一般人还真比不了群众基础好:可以说大多数程序员的成长都伴随着Spring框架,试问:现在有几家公司开发不用Spring?SpringCloud与Spring的各个框架无缝整合,对大家来说一切都是熟悉的配方,熟悉的味道。使用方便:相信大家都体会到了SpringBoot给我们开发带来的便利,而SpringCloud完全支持SpringBoot的开发,用很少的配置就能完成微服务框架的搭建

    1.1、简介

    SpringCloud是Spring旗下的项目之一,官网地址:http://projects.spring.io/spring-cloud/

    Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。

    SpringCloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:

    Eureka:服务治理组件,包含服务注册中心,服务注册与发现机制的实现。(服务治理,服务注册/发现)Zuul:网关组件,提供智能路由,访问过滤功能Ribbon:客户端负载均衡的服务调用组件(客户端负载)Feign:服务调用,给予Ribbon和Hystrix的声明式服务调用组件 (声明式服务调用)Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。(熔断、断路器,容错)

    以上只是其中一部分。

    2、SpringCloud升级,部分组件停用:

    1,Eureka停用,可以使用zk作为服务注册中心

    2,服务调用,Ribbon准备停更,代替为LoadBalance

    3,Feign改为OpenFeign

    4,Hystrix停更,改为resilence4j

    ​ 或者阿里巴巴的sentienl

    5.Zuul改为gateway

    6,服务配置Config改为 Nacos

    7,服务总线Bus改为Nacos

    3、环境搭建:

    3.1、创建父工程,pom依赖

    <!-- 统一管理jar包版本 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <lombok.version>1.16.18</lombok.version> <mysql.version>8.0.18</mysql.version> <druid.version>1.1.16</druid.version> <druid.spring.boot.starter.version>1.1.10</druid.spring.boot.starter.version> <spring.boot.version>2.2.2.RELEASE</spring.boot.version> <spring.cloud.version>Hoxton.SR1</spring.cloud.version> <spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version> <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version> <mybatis-spring-boot-starter.version>2.1.1</mybatis-spring-boot-starter.version> <hutool-all.version>5.1.0</hutool-all.version> </properties>

    <! 子模块继承之后,提供作用:锁定版本 + 子module不用谢groupId和version > <dependencyManagement> <dependencies> <!spring boot 2.2.2> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!spring cloud Hoxton.SR1> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <!Spring cloud alibaba 2.1.0.RELEASE> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>KaTeX parse error: Expected 'EOF', got '&' at position 162: …oken operator">&̲lt;</span><span…{druid.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>KaTeX parse error: Expected 'EOF', got '&' at position 299: …oken operator">&̲lt;</span><span…{mybatis-spring-boot-starter.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> </dependencies> </dependencyManagement>

    <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build>

    <!第三方maven私服> <repositories> <repository> <id>nexus-aliyun</id> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>

    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101

    3.2、创建子模块

    子模块名字:cloud-provider-payment8001

    3.3、pom依赖

    <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span><span class="token operator">&lt;</span><span class="token operator">!</span><span class="token operator">--</span> 引用自己定义的api通用包,可以使用Payment支付Entity <span class="token operator">--</span><span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>com<span class="token punctuation">.</span>atguigu<span class="token punctuation">.</span>springcloud<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>cloud<span class="token operator">-</span>api<span class="token operator">-</span>commons<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>version<span class="token punctuation">&gt;</span></span>$<span class="token punctuation">{</span>project<span class="token punctuation">.</span>version<span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>version<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>actuator<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>mybatis<span class="token punctuation">.</span>spring<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>mybatis<span class="token operator">-</span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>com<span class="token punctuation">.</span>alibaba<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>druid<span class="token operator">-</span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>version<span class="token punctuation">&gt;</span></span><span class="token number">1.1</span><span class="token number">.10</span><span class="token operator">&lt;</span><span class="token operator">/</span>version<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>mysql<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>mysql<span class="token operator">-</span>connector<span class="token operator">-</span>java<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>jdbc<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>devtools<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>scope<span class="token punctuation">&gt;</span></span>runtime<span class="token operator">&lt;</span><span class="token operator">/</span>scope<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>optional<span class="token punctuation">&gt;</span></span><span class="token boolean">true</span><span class="token operator">&lt;</span><span class="token operator">/</span>optional<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>projectlombok<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>lombok<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>optional<span class="token punctuation">&gt;</span></span><span class="token boolean">true</span><span class="token operator">&lt;</span><span class="token operator">/</span>optional<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>test<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>scope<span class="token punctuation">&gt;</span></span>test<span class="token operator">&lt;</span><span class="token operator">/</span>scope<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependencies<span class="token operator">&gt;</span> 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

    3.4、创建application.yml

    server: port: 8001

    spring: application: name: cloud-payment-service datasource: # 当前数据源操作类型 type: com.alibaba.druid.pool.DruidDataSource # mysql驱动类 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 username: root password: root

    mybatis: mapper-locations: classpath:mapper/.xml type-aliases-package: com.atguigu.springcloud.entities

    123456789101112131415161718

    3.5、主启动类

    package com.atguigu.springcloud;

    import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;

    @SpringBootApplication public class PaymentMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentMain8001.class,args); } }

    123456789101112

    3.6、业务类

    1、sql

    CREATE TABLE `payment` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `serial` varchar(200) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8 12345

    2、实体类

    package com.atguigu.springcloud.entities;

    import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;

    import java.io.Serializable;

    @Data @AllArgsConstructor //全参 @NoArgsConstructor //空参 public class Payment implements Serializable {

    <span class="token keyword">private</span> Long id<span class="token punctuation">;</span> <span class="token keyword">private</span> String serial<span class="token punctuation">;</span>

    }

    123456789101112131415161718 package com.atguigu.springcloud.entities;

    import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;

    @Data @AllArgsConstructor //全参 @NoArgsConstructor //空参 public class CommonResult <T>{

    <span class="token keyword">private</span> Integer code<span class="token punctuation">;</span> <span class="token keyword">private</span> String message<span class="token punctuation">;</span> <span class="token keyword">private</span> T data<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">CommonResult</span><span class="token punctuation">(</span>Integer code<span class="token punctuation">,</span>String message<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">(</span>code<span class="token punctuation">,</span>message<span class="token punctuation">,</span>null<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>

    }

    123456789101112131415161718192021

    3、dao层:

    package com.atguigu.springcloud.dao;

    import com.atguigu.springcloud.entities.Payment; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param;

    @Mapper public interface PaymentDao {

    <span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">create</span><span class="token punctuation">(</span>Payment payment<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">public</span> Payment <span class="token function">getPaymentById</span><span class="token punctuation">(</span><span class="token annotation punctuation">@Param</span><span class="token punctuation">(</span><span class="token string">"id"</span><span class="token punctuation">)</span> <span class="token keyword">long</span> id<span class="token punctuation">)</span><span class="token punctuation">;</span>

    }

    123456789101112131415

    4、mapper配置文件类

    ​ 在resource下,创建mapper/PayMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.atguigu.springcloud.dao.PaymentDao"> <span class="token operator">&lt;</span><span class="token operator">!</span><span class="token operator">--</span> 主要是在主键是自增的情况下,添加成功后可以直接使用主键值,其中keyProperty的值是对象的属性值不是数据库表中的字段名<span class="token operator">--</span><span class="token operator">&gt;</span> <span class="token operator">&lt;</span>insert id<span class="token operator">=</span><span class="token string">"create"</span> parameterType<span class="token operator">=</span><span class="token string">"Payment"</span> useGeneratedKeys<span class="token operator">=</span><span class="token string">"true"</span> keyProperty<span class="token operator">=</span><span class="token string">"id"</span><span class="token operator">&gt;</span> insert into <span class="token function">payment</span><span class="token punctuation">(</span>serial<span class="token punctuation">)</span> <span class="token function">values</span><span class="token punctuation">(</span>#<span class="token punctuation">{</span>serial<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>insert<span class="token operator">&gt;</span> <span class="token operator">&lt;</span>resultMap id<span class="token operator">=</span><span class="token string">"BaseResultMap"</span> type<span class="token operator">=</span><span class="token string">"com.atguigu.springcloud.entities.Payment"</span><span class="token operator">&gt;</span> <span class="token operator">&lt;</span>id column<span class="token operator">=</span><span class="token string">"id"</span> property<span class="token operator">=</span><span class="token string">"id"</span> jdbcType<span class="token operator">=</span><span class="token string">"BIGINT"</span> <span class="token operator">/</span><span class="token operator">&gt;</span> <span class="token operator">&lt;</span>id column<span class="token operator">=</span><span class="token string">"serial"</span> property<span class="token operator">=</span><span class="token string">"serial"</span> jdbcType<span class="token operator">=</span><span class="token string">"VARCHAR"</span><span class="token operator">/</span><span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>resultMap<span class="token operator">&gt;</span> <span class="token operator">&lt;</span>select id<span class="token operator">=</span><span class="token string">"getPaymentById"</span> parameterType<span class="token operator">=</span><span class="token string">"Long"</span> resultMap<span class="token operator">=</span><span class="token string">"BaseResultMap"</span><span class="token operator">&gt;</span> select <span class="token operator">*</span> from payment where id<span class="token operator">=</span>#<span class="token punctuation">{</span>id<span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>select<span class="token operator">&gt;</span>

    </mapper>

    12345678910111213141516171819

    5、service和serviceImpl

    package com.atguigu.springcloud.service;

    import com.atguigu.springcloud.entities.Payment; import org.apache.ibatis.annotations.Param;

    public interface PaymentService {

    <span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">create</span><span class="token punctuation">(</span>Payment payment<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">public</span> Payment <span class="token function">getPaymentById</span><span class="token punctuation">(</span><span class="token annotation punctuation">@Param</span><span class="token punctuation">(</span><span class="token string">"id"</span><span class="token punctuation">)</span> <span class="token keyword">long</span> id<span class="token punctuation">)</span><span class="token punctuation">;</span>

    }

    12345678910111213 package com.atguigu.springcloud.service.impl;

    import com.atguigu.springcloud.dao.PaymentDao; import com.atguigu.springcloud.entities.Payment; import com.atguigu.springcloud.service.PaymentService; import org.springframework.stereotype.Service;

    import javax.annotation.Resource;

    @Service public class PaymentServiceImpl implements PaymentService {

    <span class="token annotation punctuation">@Resource</span> <span class="token keyword">private</span> PaymentDao paymentDao<span class="token punctuation">;</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">create</span><span class="token punctuation">(</span>Payment payment<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> paymentDao<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>payment<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> Payment <span class="token function">getPaymentById</span><span class="token punctuation">(</span><span class="token keyword">long</span> id<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> paymentDao<span class="token punctuation">.</span><span class="token function">getPaymentById</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>

    }

    1234567891011121314151617181920212223242526

    6、controller

    package com.atguigu.springcloud.controller;

    import com.atguigu.springcloud.entities.CommonResult; import com.atguigu.springcloud.entities.Payment; import com.atguigu.springcloud.service.PaymentService; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController;

    import javax.annotation.Resource;

    @RestController @Slf4j public class PaymentController {

    <span class="token annotation punctuation">@Resource</span> <span class="token keyword">private</span> PaymentService paymentService<span class="token punctuation">;</span> <span class="token annotation punctuation">@PostMapping</span><span class="token punctuation">(</span>value <span class="token operator">=</span> <span class="token string">"/payment/create"</span><span class="token punctuation">)</span> <span class="token keyword">public</span> CommonResult <span class="token function">create</span><span class="token punctuation">(</span>Payment payment<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> result <span class="token operator">=</span> paymentService<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>payment<span class="token punctuation">)</span><span class="token punctuation">;</span> log<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"*****插入结果:"</span><span class="token operator">+</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>result <span class="token operator">&gt;</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">CommonResult</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">,</span><span class="token string">"插入数据库成功"</span><span class="token punctuation">,</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">CommonResult</span><span class="token punctuation">(</span><span class="token number">444</span><span class="token punctuation">,</span><span class="token string">"插入数据库失败"</span><span class="token punctuation">,</span>null<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span>value <span class="token operator">=</span> <span class="token string">"/payment/get/{id}"</span><span class="token punctuation">)</span> <span class="token keyword">public</span> CommonResult<span class="token generics function"><span class="token punctuation">&lt;</span>Payment<span class="token punctuation">&gt;</span></span> <span class="token function">getPaymentById</span><span class="token punctuation">(</span><span class="token annotation punctuation">@PathVariable</span><span class="token punctuation">(</span><span class="token string">"id"</span><span class="token punctuation">)</span> Long id<span class="token punctuation">)</span><span class="token punctuation">{</span> Payment payment <span class="token operator">=</span> paymentService<span class="token punctuation">.</span><span class="token function">getPaymentById</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span> log<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"*****查询结果:"</span><span class="token operator">+</span>payment<span class="token operator">+</span><span class="token string">"\t"</span><span class="token operator">+</span><span class="token string">"O(∩_∩)O哈哈~"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>payment <span class="token operator">!=</span> null<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">CommonResult</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">,</span><span class="token string">"查询成功"</span><span class="token punctuation">,</span>payment<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">CommonResult</span><span class="token punctuation">(</span><span class="token number">444</span><span class="token punctuation">,</span><span class="token string">"没有查到对应的记录,查询ID:"</span><span class="token operator">+</span>id<span class="token punctuation">,</span>null<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>

    }

    123456789101112131415161718192021222324252627282930313233343536373839404142434445

    3.7、测试

    先运行插入程序再运行查询程序进行测试即可!

    4、热部署

    1、添加pom依赖

    <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> 1234567

    2、修改配置 3、按==ctrl+shift+alt+== 选择Registry…

    5、order模块

    再创建一个微服务子模块,跟上一个模块一起进行测试!

    1、子模块名称:cloud-consumer-order802、添加pom依赖: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span><span class="token operator">&lt;</span><span class="token operator">!</span><span class="token operator">--</span> 引用自己定义的api通用包,可以使用Payment支付Entity <span class="token operator">--</span><span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>com<span class="token punctuation">.</span>atguigu<span class="token punctuation">.</span>springcloud<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>cloud<span class="token operator">-</span>api<span class="token operator">-</span>commons<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>version<span class="token punctuation">&gt;</span></span>$<span class="token punctuation">{</span>project<span class="token punctuation">.</span>version<span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>version<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>actuator<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>devtools<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>scope<span class="token punctuation">&gt;</span></span>runtime<span class="token operator">&lt;</span><span class="token operator">/</span>scope<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>optional<span class="token punctuation">&gt;</span></span><span class="token boolean">true</span><span class="token operator">&lt;</span><span class="token operator">/</span>optional<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>projectlombok<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>lombok<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>optional<span class="token punctuation">&gt;</span></span><span class="token boolean">true</span><span class="token operator">&lt;</span><span class="token operator">/</span>optional<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>test<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>scope<span class="token punctuation">&gt;</span></span>test<span class="token operator">&lt;</span><span class="token operator">/</span>scope<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependencies<span class="token operator">&gt;</span> 123456789101112131415161718192021222324252627282930313233343536 3、启动类: package com.atguigu.springcloud;

    import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;

    @SpringBootApplication public class OrderMain80 { public static void main(String[] args) { SpringApplication.run(OrderMain80.class,args); } }

    123456789101112 4、配置application.yml server: port: 80 12 5、实体类 package com.atguigu.springcloud.entities;

    import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;

    import java.io.Serializable;

    @Data @AllArgsConstructor //全参 @NoArgsConstructor //空参 public class Payment implements Serializable {

    <span class="token keyword">private</span> Long id<span class="token punctuation">;</span> <span class="token keyword">private</span> String serial<span class="token punctuation">;</span>

    }

    123456789101112131415161718 package com.atguigu.springcloud.entities;

    import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;

    @Data @AllArgsConstructor //全参 @NoArgsConstructor //空参 public class CommonResult<T>{

    <span class="token keyword">private</span> Integer code<span class="token punctuation">;</span> <span class="token keyword">private</span> String message<span class="token punctuation">;</span> <span class="token keyword">private</span> T data<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">CommonResult</span><span class="token punctuation">(</span>Integer code<span class="token punctuation">,</span> String message<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">(</span>code<span class="token punctuation">,</span>message<span class="token punctuation">,</span>null<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>

    }

    123456789101112131415161718192021 6、config: package com.atguigu.springcloud.config;

    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate;

    @Configuration public class ApplicationContextConfig {

    <span class="token annotation punctuation">@Bean</span> <span class="token keyword">public</span> RestTemplate <span class="token function">getRestTemplate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">RestTemplate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>

    }

    1234567891011121314 7、Controller package com.atguigu.springcloud.controller;

    import com.atguigu.springcloud.entities.CommonResult; import com.atguigu.springcloud.entities.Payment; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;

    import javax.annotation.Resource;

    @RestController @Slf4j public class OrderController { public static final String PAYMENT_URL=“http://localhost:8001”;

    <span class="token annotation punctuation">@Resource</span> <span class="token keyword">private</span> RestTemplate restTemplate<span class="token punctuation">;</span>

    @GetMapping("/consumer/payment/create") public CommonResult< Payment > create(Payment payment) { return restTemplate.postForObject(PAYMENT_URL + “/payment/create”, payment, CommonResult.class); }

    <span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span><span class="token string">"/consumer/payment/get/{id}"</span><span class="token punctuation">)</span> <span class="token keyword">public</span> CommonResult<span class="token generics function"><span class="token punctuation">&lt;</span>Payment<span class="token punctuation">&gt;</span></span> <span class="token function">getPayment</span><span class="token punctuation">(</span><span class="token annotation punctuation">@PathVariable</span><span class="token punctuation">(</span><span class="token string">"id"</span><span class="token punctuation">)</span> Long id<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">return</span> restTemplate<span class="token punctuation">.</span><span class="token function">getForObject</span><span class="token punctuation">(</span>PAYMENT_URL<span class="token operator">+</span><span class="token string">"/payment/get/"</span><span class="token operator">+</span>id<span class="token punctuation">,</span>CommonResult<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>

    }

    12345678910111213141516171819202122232425262728293031 8、测试 在测试之前一定要先在cloud-provider-payment8001模块中的PaymentController中添加==@RequestBody==,否侧添加数据时会报错。

    6、api模块

    1、放置一些通用的代码,以此来简化工程代码量。2、创建子模块:cloud-api-commons3、添加pom依赖 <dependencies> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.1.0</version> </dependency> </dependencies> 12345678910111213141516171819 4、将cloud-consumer-order80或cloud-provider-payment8001工程中的entities包下的两个实体类复制到当前的工程中。 5、在cloud-consumer-order80和cloud-provider-payment8001工程中添加pom依赖。 <dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity --> <groupId>com.atguigu.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> 12345 6、删除cloud-consumer-order80和cloud-provider-payment8001工程中的entities的实体类。7、测试。

    7、服务注册与发现Eureka:

    前面我们没有服务注册中心,也可以服务间调用,为什么还要服务注册?

    当服务很多时,单靠代码手动管理是很麻烦的,需要一个公共组件,统一管理多服务,包括服务是否正常运行,等

    Eureka用于**服务注册,目前官网已经停止更新**

    7.1、环境搭建

    1、创建子模块:cloud-eureka-server70012、添加pom依赖 <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>com<span class="token punctuation">.</span>atguigu<span class="token punctuation">.</span>springcloud<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>cloud<span class="token operator">-</span>api<span class="token operator">-</span>commons<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>version<span class="token punctuation">&gt;</span></span>$<span class="token punctuation">{</span>project<span class="token punctuation">.</span>version<span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>version<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>web<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>actuator<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>devtools<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>scope<span class="token punctuation">&gt;</span></span>runtime<span class="token operator">&lt;</span><span class="token operator">/</span>scope<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>optional<span class="token punctuation">&gt;</span></span><span class="token boolean">true</span><span class="token operator">&lt;</span><span class="token operator">/</span>optional<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>projectlombok<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>lombok<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>test<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>scope<span class="token punctuation">&gt;</span></span>test<span class="token operator">&lt;</span><span class="token operator">/</span>scope<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>junit<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>junit<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependencies<span class="token operator">&gt;</span> 1234567891011121314151617181920212223242526272829303132333435363738394041424344 3、启动类 package com.atguigu.springcloud;

    import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

    @SpringBootApplication @EnableEurekaServer public class EurekaMain7001 { public static void main(String[] args) { SpringApplication.run(EurekaMain7001.class,args); } }

    1234567891011121314 4、配置application.yml server: port: 7001

    eureka: instance: hostname: localhost #eureka服务端的实例名字 client: register-with-eureka: false #表识不向注册中心注册自己 fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务 service-url: defaultZone: http:// < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > < / s p a n > e u r e k a < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > . < / s p a n > i n s t a n c e < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > . < / s p a n > h o s t n a m e < s p a n c l a s s = " t o k e n p u n c t u a t i o n " > < / s p a n > < s p a n c l a s s = " t o k e n o p e r a t o r " > : < / s p a n > <span class="token punctuation">{</span>eureka<span class="token punctuation">.</span>instance<span class="token punctuation">.</span>hostname<span class="token punctuation">}</span><span class="token operator">:</span> <spanclass="tokenpunctuation"></span>eureka<spanclass="tokenpunctuation">.</span>instance<spanclass="tokenpunctuation">.</span>hostname<spanclass="tokenpunctuation"></span><spanclass="tokenoperator">:</span>{server.port}/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址

    1234567891011 5、测试 打开浏览器访问http://localhost:7001/进入Eureka页面。

    7.2、将微服务工程注册进Eureka

    1、将cloud-provider-payment8001注册进Eureka

    添加pom依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> 1234 配置application.yml eureka: client: register-with-eureka: true fetchRegistry: true service-url: defaultZone: http://localhost:7001/eureka 123456 在启动类添加==@EnableEurekaClient==

    测试

    打开浏览器访问http://localhost:7001/进入Eureka页面。 2、将cloud-consumer-order80注册进Eureka

    添加pom依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> 1234 配置application.yml eureka: client: register-with-eureka: true fetchRegistry: true service-url: defaultZone: http://localhost:7001/eureka 123456 在启动类添加==@EnableEurekaClient== 测试

    打开浏览器访问http://localhost:7001/进入Eureka页面。

    7.3、Eureka集群

    解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错

    7.3.1、核心原理

    互相注册,相互守望

    7.3.2、搭建集群

    1、创建一个子模块:cloud-eureka-server70022、将cloud-eureka-server7001中的依赖复制到cloud-eureka-server7002中。3、启动类 package com.atguigu.springcloud;

    import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

    @SpringBootApplication @EnableEurekaServer public class EurekaMain7002 { public static void main(String[] args) { SpringApplication.run(EurekaMain7002.class,args); } }

    1234567891011121314 4、修改映射文件 找到C:\Windows\System32\drivers\etc路径下的hosts文件 将127.0.0.1 eureka7001.com,127.0.0.1 eureka7002.com添加到host文件中。5、修改yml配置文件 1)cloud-eureka-server7001 server: port: 7001

    eureka: instance: hostname: eureka7001.com #eureka服务端的实例名字 client: register-with-eureka: false #表识不向注册中心注册自己 fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务 service-url: defaultZone: http://eureka7002.com:7002/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址

    123456789101112

    2)cloud-eureka-server7002

    server: port: 7002

    eureka: instance: hostname: eureka7002.com #eureka服务端的实例名字 client: register-with-eureka: false #表识不向注册中心注册自己 fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务 service-url: defaultZone: http://eureka7001.com:7001/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址

    1234567891011 6、测试 打开浏览器依次访问http://eureka7001.com:7001/,http://eureka7002.com:7002/ 出现如上图信息,表示Eureka集群搭建成功!

    7.3.3、微服务注册进集群

    1、将cloud-provider-payment8001和cloud-consumer-order80注册进7001/7002集群工程之中。

    2、修改yml文件: 1)cloud-provider-payment8001

    eureka: client: register-with-eureka: true fetchRegistry: true service-url: #defaultZone: http://localhost:7001/eureka defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版 12345678

    2)cloud-consumer-order80

    eureka: client: register-with-eureka: true fetchRegistry: true service-url: #defaultZone: http://localhost:7001/eureka defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版 12345678

    3、测试 先要启动EurekaServer,7001/7002服务

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

    再要启动消费者,80

    7.3.4、新增微服务,模拟负载均衡

    1、创建子模块:cloud-provider-payment80022、将cloud-provider-payment8001中的所有代码全部拷贝到cloud-provider-payment8002中。3、修改端口号和启动类,8001改成8002即可。4、在controller类中添加 @Value("${server.port}") private String serverPort; 12

    5、测试

    6、订单服务访问地址不能写死 修改cloud-consumer-order80工程中的controller类 此时,会出现访问不到具体哪个微服务端口号的错误。

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

    7、测试 打开浏览器访问http://localhost/consumer/payment/get/31 通过刷新测试,轮番出现8001和8002端口号时,表示测试成功!

    7.4、actuator微服务信息完善

    当前问题:在Eureka注册中心处微服务没有没有ip提示。解决办法: 在cloud-provider-payment8001和cloud-provider-payment8002的yml文件中添加如下配置 instance: instance-id: payment8001 prefer-ip-address: true #访问路径可以显示IP地址 123 测试

    7.5、服务发现Discovery

    1、修改cloud-provider-payment8001的Controller @Resource private DiscoveryClient discoveryClient; 12 @GetMapping(value = "/payment/discovery") public Object discovery(){ List<String> services = discoveryClient.getServices(); for (String element : services){ log.info("*****element:"+element); } List<span class="token generics function"><span class="token punctuation">&lt;</span>ServiceInstance<span class="token punctuation">&gt;</span></span> instances <span class="token operator">=</span> discoveryClient<span class="token punctuation">.</span><span class="token function">getInstances</span><span class="token punctuation">(</span><span class="token string">"CLOUD-PAYMENT-SERVICE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>ServiceInstance instance <span class="token operator">:</span> instances<span class="token punctuation">)</span> <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span>instance<span class="token punctuation">.</span><span class="token function">getServiceId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"\t"</span><span class="token operator">+</span>instance<span class="token punctuation">.</span><span class="token function">getHost</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"\t"</span><span class="token operator">+</span>instance<span class="token punctuation">.</span><span class="token function">getPort</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"\t"</span><span class="token operator">+</span>instance<span class="token punctuation">.</span><span class="token function">getUri</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>discoveryClient<span class="token punctuation">;</span> <span class="token punctuation">}</span> 12345678910111213 2、启动类 @EnableDiscoveryClient 1 3、测试 打开浏览器访问http://localhost:8001/payment/discovery 如图所示,可以看到我们在这个端口号上所有注册的微服务。

    7.6、Eureka自我保护机制

    7.6.1、关闭自我保护机制

    1、关闭集群,改用单机版测试

    2、出厂默认,自我保护机制是开启的 eureka.server.enable-self-preservation = true

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

    server: enable-self-preservation: false #关闭自我保护机制,保证不可用服务被及时剔除 eviction-interval-timer-in-ms: 2000 123 4、配置服务端cloud-provider-payment8001的yml文件 #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒) lease-renewal-interval-in-seconds: 1 #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超市将剔除服务 lease-expiration-duration-in-seconds: 2 1234 5、测试

    7.7、Eureka停更说明

    官网:https://github.com/Netflix/eureka/wiki Eureka停止更新了你怎么办? 看下面的consul

    8、Consul服务注册与发现

    8.1、简介

    官网:https://www.consul.io/intro/index.html

    1、是什么? 2、能干嘛: 服务发现:提供HTTP和DNS两种发现方式

    健康监测:支持多种协议,HTTP、TCP、Docker、Shell脚本定制化

    KV存储:key , Value的存储方式

    多数据中心:Consul支持多数据中心

    可视化Web界面

    8.2、安装并运行Consul

    官网下载:https://www.consul.io/downloads.html

    下载完成后只有一个consul.exe文件,硬盘路径下双击运行,查看版本信息。 使用开发模式启动

    在cmd窗口输入consul agent -dev

    通过以下地址可以访问Consul的首页:http;//localhost:8500

    8.3、测试

    1)

    1、创建子模块:cloud-providerconsul-payment80062、添加pom依赖: <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>com<span class="token punctuation">.</span>atguigu<span class="token punctuation">.</span>springcloud<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>cloud<span class="token operator">-</span>api<span class="token operator">-</span>commons<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>version<span class="token punctuation">&gt;</span></span>$<span class="token punctuation">{</span>project<span class="token punctuation">.</span>version<span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>version<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>web<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>actuator<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>devtools<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>scope<span class="token punctuation">&gt;</span></span>runtime<span class="token operator">&lt;</span><span class="token operator">/</span>scope<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>optional<span class="token punctuation">&gt;</span></span><span class="token boolean">true</span><span class="token operator">&lt;</span><span class="token operator">/</span>optional<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>projectlombok<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>lombok<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>optional<span class="token punctuation">&gt;</span></span><span class="token boolean">true</span><span class="token operator">&lt;</span><span class="token operator">/</span>optional<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>test<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>scope<span class="token punctuation">&gt;</span></span>test<span class="token operator">&lt;</span><span class="token operator">/</span>scope<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependencies<span class="token operator">&gt;</span> 1234567891011121314151617181920212223242526272829303132333435363738394041 3、配置yml文件 server: port: 8006

    spring: application: name: consul-provider-payment cloud: consul: host: localhost port: 8500 discovery: service-name: ${spring.application.name}

    123456789101112 4、主启动类 package com.atguigu.springcloud;

    import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

    @SpringBootApplication @EnableDiscoveryClient public class PaymentMain8006 { public static void main(String[] args) { SpringApplication.run(PaymentMain8006.class,args); } }

    1234567891011121314 5、Controller package com.atguigu.springcloud.controller;

    import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;

    import java.util.UUID;

    @RestController @Slf4j public class PaymentController {

    <span class="token annotation punctuation">@Value</span><span class="token punctuation">(</span><span class="token string">"${server.port}"</span><span class="token punctuation">)</span> <span class="token keyword">private</span> String serverPort<span class="token punctuation">;</span> <span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span>value <span class="token operator">=</span> <span class="token string">"/payment/consul"</span><span class="token punctuation">)</span> <span class="token keyword">public</span> String <span class="token function">paymentConsul</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">"springcloud with consul:"</span><span class="token operator">+</span>serverPort<span class="token operator">+</span><span class="token string">"\t"</span><span class="token operator">+</span> UUID<span class="token punctuation">.</span><span class="token function">randomUUID</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>

    }

    123456789101112131415161718192021222324

    6、测试 http://localhost:8006/payment/consul 2)

    1、创建子模块:cloud-consumerconsul-order80

    2、添加pom依赖

    <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>com<span class="token punctuation">.</span>atguigu<span class="token punctuation">.</span>springcloud<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>cloud<span class="token operator">-</span>api<span class="token operator">-</span>commons<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>version<span class="token punctuation">&gt;</span></span>$<span class="token punctuation">{</span>project<span class="token punctuation">.</span>version<span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>version<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>web<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>actuator<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>devtools<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>scope<span class="token punctuation">&gt;</span></span>runtime<span class="token operator">&lt;</span><span class="token operator">/</span>scope<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>optional<span class="token punctuation">&gt;</span></span><span class="token boolean">true</span><span class="token operator">&lt;</span><span class="token operator">/</span>optional<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>projectlombok<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>lombok<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>optional<span class="token punctuation">&gt;</span></span><span class="token boolean">true</span><span class="token operator">&lt;</span><span class="token operator">/</span>optional<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>dependency<span class="token punctuation">&gt;</span></span> <span class="token generics function"><span class="token punctuation">&lt;</span>groupId<span class="token punctuation">&gt;</span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator">&lt;</span><span class="token operator">/</span>groupId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>artifactId<span class="token punctuation">&gt;</span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>starter<span class="token operator">-</span>test<span class="token operator">&lt;</span><span class="token operator">/</span>artifactId<span class="token operator">&gt;</span> <span class="token generics function"><span class="token punctuation">&lt;</span>scope<span class="token punctuation">&gt;</span></span>test<span class="token operator">&lt;</span><span class="token operator">/</span>scope<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependency<span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>dependencies<span class="token operator">&gt;</span> 123456789101112131415161718192021222324252627282930313233343536373839404142 3、启动类 package com.atguigu.springcloud;

    import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

    @SpringBootApplication @EnableDiscoveryClient public class OrderConsulMain80 { public static void main(String[] args) { SpringApplication.run(OrderConsulMain80.class,args); } }

    1234567891011121314 4、配置yml文件 server: port: 80

    spring: application: name: consul-consumer-order cloud: consul: host: localhost port: 8500 discovery: service-name: ${spring.application.name}

    123456789101112 5、配置Bean package com.atguigu.springcloud.config;

    import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate;

    @Configuration public class ApplicationContextConfig {

    <span class="token annotation punctuation">@LoadBalanced</span> <span class="token annotation punctuation">@Bean</span> <span class="token keyword">public</span> RestTemplate <span class="token function">getRestTemplate</span><span class="token punctuation">(</span><span class="token punctuation">)<div id="article_content" class="article_content clearfix"> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-211130ba7a.css"> <div id="content_views" class="markdown_views prism-atom-one-dark"> <!-- flowchart 箭头图标 勿删 --> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p></p><div class="toc"><h3><a name="t0"></a><a name="t0"></a>目录</h3><ul><li><a href="#1SpringCloud_1" rel="nofollow" target="_self">1、初识SpringCloud</a></li><ul><li><a href="#11_11" rel="nofollow" target="_self">1.1、简介</a></li></ul><li><a href="#2SpringCloud_27" rel="nofollow" target="_self">2、SpringCloud升级,部分组件停用:</a></li><li><a href="#3_44" rel="nofollow" target="_self">3、环境搭建:</a></li><ul><li><a href="#31pom_45" rel="nofollow" target="_self">3.1、创建父工程,pom依赖</a></li><li><a href="#32_150" rel="nofollow" target="_self">3.2、创建子模块</a></li><li><a href="#33pom_153" rel="nofollow" target="_self">3.3、pom依赖</a></li><li><a href="#34applicationyml_215" rel="nofollow" target="_self">3.4、创建application.yml</a></li><li><a href="#35_237" rel="nofollow" target="_self">3.5、主启动类</a></li><li><a href="#36_253" rel="nofollow" target="_self">3.6、业务类</a></li><li><a href="#37_448" rel="nofollow" target="_self">3.7、测试</a></li></ul><li><a href="#4_451" rel="nofollow" target="_self">4、热部署</a></li><li><a href="#5order_468" rel="nofollow" target="_self">5、order模块</a></li><li><a href="#6api_638" rel="nofollow" target="_self">6、api模块</a></li><li><a href="#7Eureka_678" rel="nofollow" target="_self">7、服务注册与发现Eureka:</a></li><ul><li><a href="#71_692" rel="nofollow" target="_self">7.1、环境搭建</a></li><li><a href="#72Eureka_780" rel="nofollow" target="_self">7.2、将微服务工程注册进Eureka</a></li><li><a href="#73Eureka_839" rel="nofollow" target="_self">7.3、Eureka集群</a></li><ul><li><a href="#731_843" rel="nofollow" target="_self">7.3.1、核心原理</a></li><li><a href="#732_845" rel="nofollow" target="_self">7.3.2、搭建集群</a></li><li><a href="#733_909" rel="nofollow" target="_self">7.3.3、微服务注册进集群</a></li><li><a href="#734_946" rel="nofollow" target="_self">7.3.4、新增微服务,模拟负载均衡</a></li></ul><li><a href="#74actuator_973" rel="nofollow" target="_self">7.4、actuator微服务信息完善</a></li><li><a href="#75Discovery_986" rel="nofollow" target="_self">7.5、服务发现Discovery</a></li><li><a href="#76Eureka_1019" rel="nofollow" target="_self">7.6、Eureka自我保护机制</a></li><ul><li><a href="#761_1025" rel="nofollow" target="_self">7.6.1、关闭自我保护机制</a></li></ul><li><a href="#77Eureka_1049" rel="nofollow" target="_self">7.7、Eureka停更说明</a></li></ul><li><a href="#8Consul_1055" rel="nofollow" target="_self">8、Consul服务注册与发现</a></li><ul><li><a href="#81_1056" rel="nofollow" target="_self">8.1、简介</a></li><li><a href="#82Consul_1073" rel="nofollow" target="_self">8.2、安装并运行Consul</a></li><li><a href="#83_1085" rel="nofollow" target="_self">8.3、测试</a></li></ul><li><a href="#9_1343" rel="nofollow" target="_self">9、注册中心异同点</a></li><li><a href="#10Ribbon_1357" rel="nofollow" target="_self">10、Ribbon负载均衡服务调用</a></li><ul><li><a href="#101_1358" rel="nofollow" target="_self">10.1、概述</a></li><li><a href="#102Ribbon_1377" rel="nofollow" target="_self">10.2、Ribbon负载均衡演示</a></li><li><a href="#103RibbonIRule_1403" rel="nofollow" target="_self">10.3、Ribbon核心组件IRule</a></li><li><a href="#104Ribbon_1450" rel="nofollow" target="_self">10.4、Ribbon负载均衡算法</a></li><ul><li><a href="#1041_1455" rel="nofollow" target="_self">10.4.1、手写本地负载均衡器</a></li></ul></ul><li><a href="#11OpenFeign_1595" rel="nofollow" target="_self">11、OpenFeign服务接口调用</a></li><ul><li><a href="#111_1596" rel="nofollow" target="_self">11.1、概述</a></li><li><a href="#112OpenFeign_1606" rel="nofollow" target="_self">11.2、OpenFeign使用步骤</a></li><li><a href="#113OpenFeign_1753" rel="nofollow" target="_self">11.3、OpenFeign超时控制</a></li><li><a href="#114OpenFeign_1800" rel="nofollow" target="_self">11.4、OpenFeign日志打印功能</a></li></ul><li><a href="#12Hystrix_1834" rel="nofollow" target="_self">12、Hystrix断路器</a></li><ul><li><a href="#121_1835" rel="nofollow" target="_self">12.1、概述</a></li><li><a href="#122Hystrix_1856" rel="nofollow" target="_self">12.2、Hystrix重要概念</a></li><li><a href="#123hystrix_1876" rel="nofollow" target="_self">12.3、hystrix案例</a></li><ul><li><a href="#1231_1877" rel="nofollow" target="_self">12.3.1、入门测试</a></li><li><a href="#1232_2053" rel="nofollow" target="_self">12.3.2、高并发测试</a></li><ul><li><a href="#12321Jmeter_2055" rel="nofollow" target="_self">12.3.2.1、Jmeter压测测试</a></li><li><a href="#12322_2077" rel="nofollow" target="_self">12.3.2.2、新建模块再测试</a></li></ul></ul><li><a href="#124_2251" rel="nofollow" target="_self">12.4、服务降级</a></li><ul><li><a href="#1241_2252" rel="nofollow" target="_self">12.4.1、单局测试</a></li><li><a href="#1242_2326" rel="nofollow" target="_self">12.4.2、全局测试</a></li></ul><li><a href="#125_2400" rel="nofollow" target="_self">12.5、服务熔断</a></li><ul><li><a href="#1251_2401" rel="nofollow" target="_self">12.5.1、断路器</a></li><li><a href="#1252_2403" rel="nofollow" target="_self">12.5.2、熔断是什么</a></li><li><a href="#1253_2409" rel="nofollow" target="_self">12.5.3、实操</a></li><li><a href="#1254_2459" rel="nofollow" target="_self">12.5.4、原理(小总结)</a></li></ul><li><a href="#126hystrix_2469" rel="nofollow" target="_self">12.6、hystrix工作流程</a></li><li><a href="#127hystrixDashboard_2472" rel="nofollow" target="_self">12.7、服务监控hystrixDashboard</a></li></ul><li><a href="#13Gatewayzuul_2596" rel="nofollow" target="_self">13、Gateway新一代网关(替换zuul)</a></li><ul><li><a href="#131_2597" rel="nofollow" target="_self">13.1、概述简介</a></li><li><a href="#132_2642" rel="nofollow" target="_self">13.2、三大核心概念</a></li><li><a href="#133Gateway_2647" rel="nofollow" target="_self">13.3、Gateway工作流程</a></li><li><a href="#134_2655" rel="nofollow" target="_self">13.4、入门配置</a></li><li><a href="#135_2824" rel="nofollow" target="_self">13.5、通过微服务名实现动态路由</a></li><li><a href="#136Predicate_2873" rel="nofollow" target="_self">13.6、Predicate的使用</a></li><li><a href="#137Filter_2996" rel="nofollow" target="_self">13.7、Filter的使用</a></li></ul><li><a href="#14SpringCloud_config_3069" rel="nofollow" target="_self">14、SpringCloud config分布式配置中心</a></li><ul><li><a href="#141_3070" rel="nofollow" target="_self">14.1、概述</a></li><li><a href="#142Config_3090" rel="nofollow" target="_self">14.2、Config服务端配置与测试</a></li><li><a href="#143Config_3215" rel="nofollow" target="_self">14.3、Config客户端配置与测试</a></li><li><a href="#144Config_3353" rel="nofollow" target="_self">14.4、Config客户端之动态刷新</a></li></ul><li><a href="#15SpringCloud_Bus__3427" rel="nofollow" target="_self">15、SpringCloud Bus 消息总线</a></li><ul><li><a href="#151_3428" rel="nofollow" target="_self">15.1、概述</a></li><li><a href="#152RabbitMQ_3437" rel="nofollow" target="_self">15.2、RabbitMQ环境配置</a></li><li><a href="#153SpringCloud_Bus_3447" rel="nofollow" target="_self">15.3、SpringCloud Bus动态刷新全局广播</a></li><li><a href="#154SpringCloud_Bus_3744" rel="nofollow" target="_self">15.4、SpringCloud Bus动态刷新定点通知</a></li></ul><li><a href="#16SpringCloud_Stream_3758" rel="nofollow" target="_self">16、SpringCloud Stream消息驱动</a></li><ul><li><a href="#161_3759" rel="nofollow" target="_self">16.1、消息驱动概述</a></li><li><a href="#162_3812" rel="nofollow" target="_self">16.2、案例说明</a></li><li><a href="#163_3821" rel="nofollow" target="_self">16.3、消息驱动之生产者</a></li><li><a href="#164_3991" rel="nofollow" target="_self">16.4、消息驱动之消费者</a></li><li><a href="#165_4118" rel="nofollow" target="_self">16.5、分组消费与持久化</a></li></ul><li><a href="#17SpringCloud_Sleuth_4179" rel="nofollow" target="_self">17、SpringCloud Sleuth分布式请求链路追踪</a></li><ul><li><a href="#171_4181" rel="nofollow" target="_self">17.1、概述</a></li><li><a href="#172_4195" rel="nofollow" target="_self">17.2、搭建链路监控步骤</a></li></ul><li><a href="#18SpringCloud_Alibaba_4281" rel="nofollow" target="_self">18、SpringCloud Alibaba入门简介</a></li><li><a href="#19SpringCloud_Alibaba_Nacos_4336" rel="nofollow" target="_self">19、SpringCloud Alibaba Nacos服务注册和配置中心</a></li><ul><li><a href="#191Nacos_4337" rel="nofollow" target="_self">19.1、Nacos简介</a></li><li><a href="#192Nacos_4362" rel="nofollow" target="_self">19.2、安装并运行Nacos</a></li><li><a href="#193Nacos_4375" rel="nofollow" target="_self">19.3、Nacos作为服务注册中心演示</a></li><li><a href="#194Nacos_4645" rel="nofollow" target="_self">19.4、Nacos作为服务配置中心演示</a></li><li><a href="#195Nacos_4843" rel="nofollow" target="_self">19.5、Nacos集群和持久化配置(重要)</a></li><ul><li><a href="#1951_4844" rel="nofollow" target="_self">19.5.1、官网说明</a></li><li><a href="#1952Nacos_4860" rel="nofollow" target="_self">19.5.2、Nacos持久化配置解释</a></li><li><a href="#1953LinuxNacosMySQL_4881" rel="nofollow" target="_self">19.5.3、Linux版Nacos+MySQL生产环境配置</a></li></ul></ul><li><a href="#20SpringCloud_Alibaba_Sentinel_4959" rel="nofollow" target="_self">20、SpringCloud Alibaba Sentinel实现熔断与限流</a></li><ul><li><a href="#201Sentinel_4960" rel="nofollow" target="_self">20.1、Sentinel简介</a></li><li><a href="#202Sentinel_4984" rel="nofollow" target="_self">20.2、安装Sentinel控制台</a></li><li><a href="#203_5003" rel="nofollow" target="_self">20.3、初始化演示工程</a></li><li><a href="#204_5147" rel="nofollow" target="_self">20.4、流控规则</a></li><li><a href="#205_5242" rel="nofollow" target="_self">20.5、降级规则</a></li><li><a href="#206key_5315" rel="nofollow" target="_self">20.6、热点key限流</a></li><li><a href="#207_5376" rel="nofollow" target="_self">20.7、系统规则</a></li><li><a href="#208SentinelResource_5385" rel="nofollow" target="_self">20.8、@SentinelResource</a></li><li><a href="#209_5515" rel="nofollow" target="_self">20.9、服务熔断功能</a></li><ul><li><a href="#2091Ribbon_5516" rel="nofollow" target="_self">20.9.1、Ribbon系列</a></li><li><a href="#2092Feign_5800" rel="nofollow" target="_self">20.9.2、Feign系列</a></li></ul><li><a href="#2010_5880" rel="nofollow" target="_self">20.10、规则持久化</a></li></ul><li><a href="#21SpringCloud_Alibaba_Seata_5966" rel="nofollow" target="_self">21、SpringCloud Alibaba Seata处理分布式事务</a></li><ul><li><a href="#211_5967" rel="nofollow" target="_self">21.1、分布式事务问题</a></li><li><a href="#212Seata_5978" rel="nofollow" target="_self">21.2、Seata简介</a></li><li><a href="#213SeataServer_6010" rel="nofollow" target="_self">21.3、Seata-Server安装与配置</a></li><li><a href="#214_6114" rel="nofollow" target="_self">21.4、订单/库存/账户业务数据库准备</a></li><li><a href="#215_6210" rel="nofollow" target="_self">21.5、订单/库存/账户业务微服务准备</a></li><ul><li><a href="#2151OrderModule_6211" rel="nofollow" target="_self">21.5.1、新建订单Order-Module</a></li><li><a href="#2152StorageModule_6804" rel="nofollow" target="_self">21.5.2、新建库存Storage-Module</a></li><li><a href="#2153AccountModule_7236" rel="nofollow" target="_self">21.5.3、新建账户Account-Module</a></li><li><a href="#2154Test_7794" rel="nofollow" target="_self">21.5.4、Test</a></li></ul><li><a href="#216Seata_7816" rel="nofollow" target="_self">21.6、Seata之原理</a></li></ul></ul></div><p></p>

    1、初识SpringCloud

    微服务是一种架构方式,最终肯定需要技术架构去实施。

    微服务的实现方式很多,但是最火的莫过于Spring Cloud了。为什么?

    后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大。技术强:Spring作为Java领域的前辈,可以说是功力深厚。有强力的技术团队支撑,一般人还真比不了群众基础好:可以说大多数程序员的成长都伴随着Spring框架,试问:现在有几家公司开发不用Spring?SpringCloud与Spring的各个框架无缝整合,对大家来说一切都是熟悉的配方,熟悉的味道。使用方便:相信大家都体会到了SpringBoot给我们开发带来的便利,而SpringCloud完全支持SpringBoot的开发,用很少的配置就能完成微服务框架的搭建

    1.1、简介

    SpringCloud是Spring旗下的项目之一,官网地址:http://projects.spring.io/spring-cloud/

    Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。

    SpringCloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:

    Eureka:服务治理组件,包含服务注册中心,服务注册与发现机制的实现。(服务治理,服务注册/发现)Zuul:网关组件,提供智能路由,访问过滤功能Ribbon:客户端负载均衡的服务调用组件(客户端负载)Feign:服务调用,给予Ribbon和Hystrix的声明式服务调用组件 (声明式服务调用)Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。(熔断、断路器,容错)

    以上只

    Processed: 0.011, SQL: 10