内容:
感谢原创:花心思整理此脑图,此处分享让更多人看见
https://www.processon.com/view/link/5e6b6342e4b0e3993b62db71#map
源码地址: https://github.com/zhengsh/ssm-laboratory
目录
- 1、初识SpringCloud
- 2、SpringCloud升级,部分组件停用:
- 3、环境搭建:
- 4、热部署
- 5、order模块
- 6、api模块
- 7、服务注册与发现Eureka:
- 8、Consul服务注册与发现
- 9、注册中心异同点
- 10、Ribbon负载均衡服务调用
- 11、OpenFeign服务接口调用
- 12、Hystrix断路器
- 13、Gateway新一代网关(替换zuul)
- 14、SpringCloud config分布式配置中心
- 15、SpringCloud Bus 消息总线
- 16、SpringCloud Stream消息驱动
- 17、SpringCloud Sleuth分布式请求链路追踪
- 18、SpringCloud Alibaba入门简介
- 19、SpringCloud Alibaba Nacos服务注册和配置中心
- 20、SpringCloud Alibaba Sentinel实现熔断与限流
- 21、SpringCloud Alibaba 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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
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"><</span>dependency<span class="token punctuation">></span></span><span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 引用自己定义的api通用包,可以使用Payment支付Entity <span class="token operator">--</span><span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>com<span class="token punctuation">.</span>atguigu<span class="token punctuation">.</span>springcloud<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>cloud<span class="token operator">-</span>api<span class="token operator">-</span>commons<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>version<span class="token punctuation">></span></span>$<span class="token punctuation">{</span>project<span class="token punctuation">.</span>version<span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>version<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></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"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>com<span class="token punctuation">.</span>alibaba<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>version<span class="token punctuation">></span></span><span class="token number">1.1</span><span class="token number">.10</span><span class="token operator"><</span><span class="token operator">/</span>version<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>mysql<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>mysql<span class="token operator">-</span>connector<span class="token operator">-</span>java<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>devtools<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>scope<span class="token punctuation">></span></span>runtime<span class="token operator"><</span><span class="token operator">/</span>scope<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>optional<span class="token punctuation">></span></span><span class="token boolean">true</span><span class="token operator"><</span><span class="token operator">/</span>optional<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>projectlombok<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>lombok<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>optional<span class="token punctuation">></span></span><span class="token boolean">true</span><span class="token operator"><</span><span class="token operator">/</span>optional<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>scope<span class="token punctuation">></span></span>test<span class="token operator"><</span><span class="token operator">/</span>scope<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependencies<span class="token operator">></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
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
- 1
- 2
- 3
- 4
- 5
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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
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"><</span><span class="token operator">!</span><span class="token operator">--</span> 主要是在主键是自增的情况下,添加成功后可以直接使用主键值,其中keyProperty的值是对象的属性值不是数据库表中的字段名<span class="token operator">--</span><span class="token operator">></span> <span class="token operator"><</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">></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"><</span><span class="token operator">/</span>insert<span class="token operator">></span> <span class="token operator"><</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">></span> <span class="token operator"><</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">></span> <span class="token operator"><</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">></span> <span class="token operator"><</span><span class="token operator">/</span>resultMap<span class="token operator">></span> <span class="token operator"><</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">></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"><</span><span class="token operator">/</span>select<span class="token operator">></span>
</mapper>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
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">></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"><</span>Payment<span class="token punctuation">></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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
3.7、测试
先运行插入程序再运行查询程序进行测试即可!
4、热部署
1、添加pom依赖
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2、修改配置
3、按==ctrl+shift+alt+==
选择Registry…
5、order模块
再创建一个微服务子模块,跟上一个模块一起进行测试!
- 1、子模块名称:cloud-consumer-order80
- 2、添加pom依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span><span class="token operator"><</span><span class="token operator">!</span><span class="token operator">--</span> 引用自己定义的api通用包,可以使用Payment支付Entity <span class="token operator">--</span><span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>com<span class="token punctuation">.</span>atguigu<span class="token punctuation">.</span>springcloud<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>cloud<span class="token operator">-</span>api<span class="token operator">-</span>commons<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>version<span class="token punctuation">></span></span>$<span class="token punctuation">{</span>project<span class="token punctuation">.</span>version<span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>version<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>devtools<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>scope<span class="token punctuation">></span></span>runtime<span class="token operator"><</span><span class="token operator">/</span>scope<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>optional<span class="token punctuation">></span></span><span class="token boolean">true</span><span class="token operator"><</span><span class="token operator">/</span>optional<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>projectlombok<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>lombok<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>optional<span class="token punctuation">></span></span><span class="token boolean">true</span><span class="token operator"><</span><span class="token operator">/</span>optional<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>scope<span class="token punctuation">></span></span>test<span class="token operator"><</span><span class="token operator">/</span>scope<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependencies<span class="token operator">></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 4、配置application.yml
server:
port: 80
- 1
- 2
- 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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 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"><</span>Payment<span class="token punctuation">></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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 8、测试
在测试之前一定要先在cloud-provider-payment8001模块中的PaymentController中添加==@RequestBody==,否侧添加数据时会报错。
6、api模块
- 1、放置一些通用的代码,以此来简化工程代码量。
- 2、创建子模块:cloud-api-commons
- 3、添加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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 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>
- 1
- 2
- 3
- 4
- 5
- 6、删除cloud-consumer-order80和cloud-provider-payment8001工程中的entities的实体类。
- 7、测试。
7、服务注册与发现Eureka:
前面我们没有服务注册中心,也可以服务间调用,为什么还要服务注册?
当服务很多时,单靠代码手动管理是很麻烦的,需要一个公共组件,统一管理多服务,包括服务是否正常运行,等
Eureka用于**服务注册,目前官网已经停止更新**
7.1、环境搭建
- 1、创建子模块:cloud-eureka-server7001
- 2、添加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"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>com<span class="token punctuation">.</span>atguigu<span class="token punctuation">.</span>springcloud<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>cloud<span class="token operator">-</span>api<span class="token operator">-</span>commons<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>version<span class="token punctuation">></span></span>$<span class="token punctuation">{</span>project<span class="token punctuation">.</span>version<span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>version<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>devtools<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>scope<span class="token punctuation">></span></span>runtime<span class="token operator"><</span><span class="token operator">/</span>scope<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>optional<span class="token punctuation">></span></span><span class="token boolean">true</span><span class="token operator"><</span><span class="token operator">/</span>optional<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>projectlombok<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>lombok<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>scope<span class="token punctuation">></span></span>test<span class="token operator"><</span><span class="token operator">/</span>scope<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>junit<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>junit<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependencies<span class="token operator">></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 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交互的地址查询服务和注册服务都需要依赖这个地址
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 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>
- 1
- 2
- 3
- 4
- 配置application.yml
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
- 1
- 2
- 3
- 4
- 5
- 6
- 在启动类添加==@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>
- 1
- 2
- 3
- 4
- 配置application.yml
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
- 1
- 2
- 3
- 4
- 5
- 6
- 在启动类添加==@EnableEurekaClient==
- 测试
打开浏览器访问http://localhost:7001/进入Eureka页面。
7.3、Eureka集群
解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错
7.3.1、核心原理
互相注册,相互守望
7.3.2、搭建集群
- 1、创建一个子模块:cloud-eureka-server7002
- 2、将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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 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交互的地址查询服务和注册服务都需要依赖这个地址
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
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交互的地址查询服务和注册服务都需要依赖这个地址
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 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 #集群版
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
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 #集群版
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
-
3、测试
先要启动EurekaServer,7001/7002服务再要启动服务提供者provider,8001服务
再要启动消费者,80
7.3.4、新增微服务,模拟负载均衡
- 1、创建子模块:cloud-provider-payment8002
- 2、将cloud-provider-payment8001中的所有代码全部拷贝到cloud-provider-payment8002中。
- 3、修改端口号和启动类,8001改成8002即可。
- 4、在controller类中添加
@Value("${server.port}")
private String serverPort;
- 1
- 2
-
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地址
- 1
- 2
- 3
- 测试
7.5、服务发现Discovery
- 1、修改cloud-provider-payment8001的Controller
@Resource
private DiscoveryClient discoveryClient;
- 1
- 2
@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"><</span>ServiceInstance<span class="token punctuation">></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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 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
- 1
- 2
- 3
- 4、配置服务端cloud-provider-payment8001的yml文件
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
lease-renewal-interval-in-seconds: 1
#Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超市将剔除服务
lease-expiration-duration-in-seconds: 2
- 1
- 2
- 3
- 4
- 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-payment8006
- 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"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>com<span class="token punctuation">.</span>atguigu<span class="token punctuation">.</span>springcloud<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>cloud<span class="token operator">-</span>api<span class="token operator">-</span>commons<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>version<span class="token punctuation">></span></span>$<span class="token punctuation">{</span>project<span class="token punctuation">.</span>version<span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>version<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>devtools<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>scope<span class="token punctuation">></span></span>runtime<span class="token operator"><</span><span class="token operator">/</span>scope<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>optional<span class="token punctuation">></span></span><span class="token boolean">true</span><span class="token operator"><</span><span class="token operator">/</span>optional<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>projectlombok<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>lombok<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>optional<span class="token punctuation">></span></span><span class="token boolean">true</span><span class="token operator"><</span><span class="token operator">/</span>optional<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>scope<span class="token punctuation">></span></span>test<span class="token operator"><</span><span class="token operator">/</span>scope<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependencies<span class="token operator">></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 3、配置yml文件
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 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>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
-
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"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>com<span class="token punctuation">.</span>atguigu<span class="token punctuation">.</span>springcloud<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>cloud<span class="token operator">-</span>api<span class="token operator">-</span>commons<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>version<span class="token punctuation">></span></span>$<span class="token punctuation">{</span>project<span class="token punctuation">.</span>version<span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>version<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>spring<span class="token operator">-</span>boot<span class="token operator">-</span>devtools<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>scope<span class="token punctuation">></span></span>runtime<span class="token operator"><</span><span class="token operator">/</span>scope<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>optional<span class="token punctuation">></span></span><span class="token boolean">true</span><span class="token operator"><</span><span class="token operator">/</span>optional<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>projectlombok<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></span></span>lombok<span class="token operator"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>optional<span class="token punctuation">></span></span><span class="token boolean">true</span><span class="token operator"><</span><span class="token operator">/</span>optional<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>dependency<span class="token punctuation">></span></span> <span class="token generics function"><span class="token punctuation"><</span>groupId<span class="token punctuation">></span></span>org<span class="token punctuation">.</span>springframework<span class="token punctuation">.</span>boot<span class="token operator"><</span><span class="token operator">/</span>groupId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>artifactId<span class="token punctuation">></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"><</span><span class="token operator">/</span>artifactId<span class="token operator">></span> <span class="token generics function"><span class="token punctuation"><</span>scope<span class="token punctuation">></span></span>test<span class="token operator"><</span><span class="token operator">/</span>scope<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependency<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>dependencies<span class="token operator">></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 4、配置yml文件
server:
port: 80
spring:
application:
name: consul-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 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:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。(熔断、断路器,容错)
以上只