項目完整源碼https://gitee.com/chuzhuyong/spring-cloud2020/tree/master
本次項目使用的Spring Boot和Spring Cloud的版本
Rest微服務構建案例工程模塊
一、使用maven構建整體父工程spring-cloud2020
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.uos.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <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> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.4</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
二、microservicecloud-api公共子模塊Module
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent><!-- 子類里面顯示聲明才能有明確的繼承表現,無意外就是父類的默認版本否則自己定義 --> <groupId>com.uos.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <packaging>jar</packaging> <artifactId>microservicecloud-api</artifactId><!-- 當前Module我自己叫什么名字 --> <dependencies><!-- 當前Module需要用到的jar包,按自己需求添加,如果父類已經包含了,可以不用寫版本號 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project>
新建部門Entity且配合lombok使用
每次新建一個子模塊時,整體父工程的pom文件就會相應的增加對應的module
三、microservicecloud-provider-dept-8001 部門微服務提供者Module
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.uos.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-provider-dept-8001</artifactId> <dependencies> <dependency><!-- 引入自己定義的api通用包,可以使用Dept部門Entity --> <groupId>com.uos.springcloud</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- 修改后立即生效,熱部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
application.yml
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路徑
type-aliases-package: com.uos.springcloud.entities # 所有Entity別名類所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 當前數據源操作類型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包
url: jdbc:mysql://localhost:3306/cloudDB01?serverTimezone=UTC # 數據庫名稱
username: root
password: 123456
dbcp2:
min-idle: 5 # 數據庫連接池的最小維持連接數
initial-size: 5 # 初始化連接數
max-total: 5 # 最大連接數
max-wait-millis: 200 # 等待連接獲取的最大超時時間
工程src/main/resources目錄下新建mybatis文件夾后新建mybatis.cfg.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="cacheEnabled" value="true"/><!-- 二級緩存開啟 --> </settings> </configuration>
MySQL創建部門數據庫腳本
DROP DATABASE IF EXISTS cloudDB01; CREATE DATABASE cloudDB01 CHARACTER SET UTF8; USE cloudDB01; CREATE TABLE dept ( deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, dname VARCHAR(60), db_source VARCHAR(60) ); INSERT INTO dept(dname,db_source) VALUES('開發部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('財務部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('市場部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('運維部',DATABASE());
DeptDao部門接口
工程src/main/resources/mybatis目錄下新建mapper文件夾后再建DeptDao.xml
DeptService部門服務接口
DeptServiceImpl部門服務接口實現類
DeptController部門微服務提供者REST
DeptProvider8001_App主啟動類DeptProvider8001_App
package com.uos.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DeptProvider8001_App{ public static void main(String[] args){ SpringApplication.run(DeptProvider8001_App.class, args); } }
測試http://localhost:8001/dept/get/2
測試 http://localhost:8001/dept/list
四、microservicecloud-consumer-dept-80 部門微服務消費者Module
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.uos.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-consumer-dept-80</artifactId> <description>部門微服務消費者</description> <dependencies> <dependency><!-- 自己定義的api --> <groupId>com.uos.springcloud</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 修改后立即生效,熱部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
application.yml
server:
port: 8080
com.uos.springcloud.cfgbeans包下ConfigBean的編寫(類似spring里面的applicationContext.xml寫入的注入Bean)
com.uos.springcloud.controller包下新建DeptController_Consumer部門微服務消費者REST
@RestController public class DeptController_Consumer { private static final String REST_URL_PREFIX = "http://localhost:8001"; @Autowired private RestTemplate restTemplate; /** * 使用restTemplate訪問restful接口非常的簡單粗暴無腦。 * (url, requestMap, ResponseBean.class)這三個參數分別代表 * REST請求地址、請求參數、HTTP響應轉換被轉換成的對象類型。 */ @RequestMapping(value="/consumer/dept/add") public boolean add(Dept dept) { return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, Boolean.class); } @RequestMapping(value="/consumer/dept/get/{id}") public Dept get(@PathVariable("id") Long id) { return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class); } @SuppressWarnings("unchecked") @RequestMapping(value="/consumer/dept/list") public List<Dept> list() { return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class); }
}
DeptConsumer80_App主啟動類
測試http://localhost:8080/consumer/dept/get/2
測試http://localhost:8080/consumer/dept/list
測試http://localhost:8080/consumer/dept/add?dname=AI
Eureka服務注冊與發現
構建步驟
一、microservicecloud-eureka-7001 eureka服務注冊中心Module
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.uos.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-eureka-7001</artifactId> <dependencies> <!--eureka-server服務端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <!-- 修改后立即生效,熱部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
application.yml
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服務端的實例名稱
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務實例,並不需要去檢索服務
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置與Eureka Server交互的地址查詢服務和注冊服務都需要依賴這個地址。
EurekaServer7001_App主啟動類
測試http://localhost:7001/
No application available 沒有服務被發現 因為沒有注冊服務進來當然不可能有服務被發現
二、修改microservicecloud-provider-dept-8001 將已有的部門微服務注冊進eureka服務中心
向pom.xml中添加
<!-- 將微服務provider注冊進eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
向application.yml中添加
eureka:
client: #客戶端注冊進eureka服務列表內
service-url:
defaultZone: http://localhost:7001/eureka
DeptProvider8001_App主啟動類
添加@EnableEurekaClient //本服務啟動后會自動注冊進eureka服務中
測試
先要啟動EurekaServer
三、actuator與注冊微服務信息完善
主機名稱:服務名稱修改
修改microservicecloud-provider-dept-8001
向application.yml中添加
instance:
instance-id: microservicecloud-dept8001
訪問信息有IP信息提示
prefer-ip-address: true #訪問路徑可以顯示IP地址
微服務info內容詳細信息
修改microservicecloud-provider-dept-8001
向pom.xml中添加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
總的父工程修改pom.xml添加構建build信息
<build> <finalName>microservicecloud</finalName> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <delimiters> <delimit>$</delimit> </delimiters> </configuration> </plugin> </plugins> </build>
修改microservicecloud-provider-dept-8001
application.yml
info:
app.name: uos-microservicecloud
company.name: www.baidu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
集群配置
一、新建microservicecloud-eureka-7002/microservicecloud-eureka-7003
二、按照7001為模板粘貼pom
三、修改7002和7003的主啟動類
四、修改映射配置
五、3台eureka服務器的yml配置
7001
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服務端的實例名稱
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務實例,並不需要去檢索服務
service-url:
#單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置與Eureka Server交互的地址查詢服務和注冊服務都需要依賴這個地址(單機)。
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
7002
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服務端的實例名稱
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務實例,並不需要去檢索服務
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置與Eureka Server交互的地址查詢服務和注冊服務都需要依賴這個地址。
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
7003
server:
port: 7003
eureka:
instance:
hostname: eureka7003.com #eureka服務端的實例名稱
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務實例,並不需要去檢索服務
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置與Eureka Server交互的地址查詢服務和注冊服務都需要依賴這個地址。
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
六、microservicecloud-provider-dept-8001 微服務發布到上面3台eureka集群配置中
測試http://eureka7001.com:7001/ 同理可以測試http://eureka7002.com:7002/ ,http://eureka7003.com:7003/
Ribbon負載均衡
一、Ribbon配置初步
修改microservicecloud-consumer-dept-80工程
在修改pom.xml文件中添加
<!-- Ribbon相關 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
修改application.yml 追加eureka的服務注冊地址
eureka:
client:
service-url:
register-with-eureka: false #false表示不向注冊中心注冊自己。
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
對ConfigBean進行新注解@LoadBalanced 獲得Rest時加入Ribbon的配置
主啟動類DeptConsumer80_App添加@EnableEurekaClient
修改DeptController_Consumer客戶端訪問類
先啟動3個eureka集群后,再啟動microservicecloud-provider-dept-8001並注冊進eureka,再啟動microservicecloud-consumer-dept-80
測試
二、Ribbon負載均衡
架構說明
Ribbon在工作時分成兩步
第一步先選擇 EurekaServer ,它優先選擇在同一個區域內負載較少的server.
第二步再根據用戶指定的策略,在從server取到的服務注冊列表中選擇一個地址。
其中Ribbon提供了多種策略:比如輪詢、隨機和根據響應時間加權。
參考microservicecloud-provider-dept-8001,新建兩份,分別命名為8002,8003
新建8002/8003數據庫,各自微服務分別連各自的數據庫
8002SQL腳本
DROP DATABASE IF EXISTS cloudDB02; CREATE DATABASE cloudDB02 CHARACTER SET UTF8; USE cloudDB02; CREATE TABLE dept ( deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, dname VARCHAR(60), db_source VARCHAR(60) ); INSERT INTO dept(dname,db_source) VALUES('開發部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('財務部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('市場部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('運維部',DATABASE());
8003SQL腳本
DROP DATABASE IF EXISTS cloudDB03; CREATE DATABASE cloudDB03 CHARACTER SET UTF8; USE cloudDB03; CREATE TABLE dept ( deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, dname VARCHAR(60), db_source VARCHAR(60) ); INSERT INTO dept(dname,db_source) VALUES('開發部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('財務部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('市場部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('運維部',DATABASE());
修改8002/8003各自YML
8002YML
server: port: 8002 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路徑 type-aliases-package: com.uos.springcloud.entities # 所有Entity別名類所在包 mapper-locations: - classpath:mybatis/mapper/**/*.xml # mapper映射文件 spring: application: name: microservicecloud-dept datasource: type: com.alibaba.druid.pool.DruidDataSource # 當前數據源操作類型 driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包 url: jdbc:mysql://localhost:3306/cloudDB02?serverTimezone=UTC # 數據庫名稱 username: root password: 123456 dbcp2: min-idle: 5 # 數據庫連接池的最小維持連接數 initial-size: 5 # 初始化連接數 max-total: 5 # 最大連接數 max-wait-millis: 200 # 等待連接獲取的最大超時時間 eureka: client: #客戶端注冊進eureka服務列表內 service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ instance: instance-id: microservicecloud-dept8002 prefer-ip-address: true #訪問路徑可以顯示IP地址 info: app.name: uos-microservicecloud company.name: www.baidu.com build.artifactId: $project.artifactId$ build.version: $project.version$
8003YML
server: port: 8003 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路徑 type-aliases-package: com.uos.springcloud.entities # 所有Entity別名類所在包 mapper-locations: - classpath:mybatis/mapper/**/*.xml # mapper映射文件 spring: application: name: microservicecloud-dept datasource: type: com.alibaba.druid.pool.DruidDataSource # 當前數據源操作類型 driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包 url: jdbc:mysql://localhost:3306/cloudDB03?serverTimezone=UTC # 數據庫名稱 username: root password: 123456 dbcp2: min-idle: 5 # 數據庫連接池的最小維持連接數 initial-size: 5 # 初始化連接數 max-total: 5 # 最大連接數 max-wait-millis: 200 # 等待連接獲取的最大超時時間 eureka: client: #客戶端注冊進eureka服務列表內 service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ instance: instance-id: microservicecloud-dept8003 prefer-ip-address: true #訪問路徑可以顯示IP地址 info: app.name: uos-microservicecloud company.name: www.baidu.com build.artifactId: $project.artifactId$ build.version: $project.version$
啟動3個eureka集群配置區
啟動3個Dept微服務啟動並各自測試通過
啟動microservicecloud-consumer-dept-80
客戶端通過Ribbo完成負載均衡並訪問上一步的Dept微服務
默認使用的是輪詢算法,每個微服務都會被輪詢訪問一次
總結:Ribbon其實就是一個軟負載均衡的客戶端組件,
他可以和其他所需請求的客戶端結合使用,和eureka結合只是其中的一個實例。
三、 Ribbon核心組件IRule
根據特定的算法從服務列表中選取一個要訪問的服務
四、Ribbon自定義
主啟動類上添加@RibbonClient注解
注意:Ribbon自定義配置類不能在包含@CompentScan注解的包及子包下新建
在上述過程中,我們新建一個myrule包,在myrule包下新建MySelfRule配置類。
在github上復制並修改源碼 https://github.com/Netflix/ribbon/blob/master/ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/RandomRule.java
Feign負載均衡
參考microservicecloud-consumer-dept-80,新建microservicecloud-consumer-dept-feign
microservicecloud-consumer-dept-feign工程pom.xml修改,主要添加對feign的支持
修改microservicecloud-api工程
pom.xml
新建DeptClientService接口並新增注解@FeignClient
microservicecloud-consumer-dept-feign工程修改Controller,添加上一步新建的DeptClientService接口
microservicecloud-consumer-dept-feign工程修改主啟動類
測試
總結
Feign通過接口的方法調用Rest服務(之前是Ribbon+RestTemplate),該請求發送給Eureka服務器(http://MICROSERVICECLOUD-DEPT/dept/list),
通過Feign直接找到服務接口,由於在進行服務調用的時候融合了Ribbon技術,所以也支持負載均衡作用。
服務熔斷
參考microservicecloud-provider-dept-8001,新建microservicecloud-provider-dept-hystrix-8001
pom.xml
application.yml
修改DeptController
修改主啟動類DeptProvider8001_Hystrix_App並添加新注解@EnableCircuitBreaker
測試
服務降級
修改microservicecloud-api工程,
根據已經有的DeptClientService接口新建一個實現了
FallbackFactory接口的類DeptClientServiceFallbackFactory
@Component public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> { @Override public DeptClientService create(Throwable throwable) { return new DeptClientService() { @Override public Dept get(long id) { return new Dept().setDeptno(id) .setDname("該ID:"+id+"沒有對應的信息,Consumer客戶端提供的降級信息,此刻服務Provider已經關閉") .setDb_source("no this database in MySQL"); } @Override public List<Dept> list() { return null; } @Override public boolean add(Dept dept) { return false; } }; } }
修改microservicecloud-api工程,DeptClientService接口在注解@FeignClient中添加fallbackFactory屬性值
microservicecloud-consumer-dept-feign工程修改YML
測試
服務監控hystrixDashboard
新建工程microservicecloud-consumer-hystrix-dashboard
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservicecloud</artifactId> <groupId>com.uos.springcloud</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservicecloud-consumer-hystrix-dashboard</artifactId> <dependencies> <!-- 自己定義的api --> <dependency> <groupId>com.uos.springcloud</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 修改后立即生效,熱部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!-- Ribbon相關 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!-- feign相關 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <!-- hystrix和 hystrix-dashboard相關--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency> </dependencies> </project>
application.yml
server:
port: 9001
主啟動類改名+新注解@EnableHystrixDashboard
所有Provider微服務提供類(8001/8002/8003)都需要監控依賴配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
啟動microservicecloud-consumer-hystrix-dashboard該微服務監控消費端
啟動3個eureka集群
啟動microservicecloud-provider-dept-hystrix-8001
啟動的相關微服務工程
實心圓:共有兩種含義。它通過顏色的變化代表了實例的健康程度,它的健康度從綠色<黃色<橙色<紅色遞減。
該實心圓除了顏色的變化之外,它的大小也會根據實例的請求流量發生變化,流量越大該實心圓就越大。所以通過該實心圓的展示,就可以在大量的實例中快速的發現故障實例和高壓力實例。
說明
復雜圖形
zuul路由網關
一、路由基本配置
新建Module模塊microservicecloud-zuul-gateway-9527
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservicecloud</artifactId> <groupId>com.uos.springcloud</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservicecloud-zuul-gateway-9527</artifactId> <dependencies> <!-- zuul路由網關 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- actuator監控 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- hystrix容錯--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!-- 日常標配 --> <dependency> <groupId>com.uos.springcloud</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- 熱部署插件 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
application.yml
server:
port: 9527
spring:
application:
name: microservicecloud-zuul-gateway
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
instance:
instance-id: gateway-9527.com
prefer-ip-address: true
info:
app.name: uos-microcloud
company.name: www.uos.com
build.artifactId: $project.artifactId$
build.version: $project.version$
hosts文件修改
主啟動類
不用路由
使用路由
二、路由訪問映射規則
代理名稱
測試
Spring Cloud Config分布式配置中心
在github上新建一個名稱為microservicecloud-config的倉庫
由上一步獲得SSH協議的git地址 git@github.com:Amonologue129/microservicecloud-config.git
本地硬盤目錄上新建 git倉庫並clone
在本地路徑下新建一個application.yml
將上一步的yml文件推送到github上
新建 microservicecloud-config-3344 module
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservicecloud</artifactId> <groupId>com.uos.springcloud</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservicecloud-config-3344</artifactId> <dependencies> <!--Spring Cloud Config相關--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
application.yml
server:
port: 3344
spring:
application:
name: microservicecloud-config
cloud:
config:
server:
git:
uri: https://github.com/Amonologue129/microservicecloud-config.git
username:
password:
主啟動類
hosts文件修改 127.0.0.1 config-3344.com
訪問的方式
在E:\44\mySpringCloud\microservicecloud-config下新建microservicecloud-config-client.yml文件並上傳到github上
server:
port: 8201
spring:
profiles: dev
application:
name: microservicecloud-config-client
eureka:
client:
service-url:
defaultZone: http://eureka-dev.com:7001/eureka
---
server:
port: 8202
spring:
profiles: test
application:
name: microservicecloud-config-client
eureka:
client:
service-url:
defaultZone: http://eureka-test.com:7001/eureka
配置客戶端
新建microservicecloud-config-client-3355 Module
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservicecloud</artifactId> <groupId>com.uos.springcloud</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservicecloud-config-client-3355</artifactId> <dependencies> <!-- spring cloud config 客戶端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
bootstrap.yml
## application.yml 是用戶級別的資源配置項
## bootstrap.yml 是系統級別的。優先級更高
spring:
cloud:
config:
name: microservicecloud-config-client # 需要從git 上讀取的資源名稱,注意沒有yml后綴
profile: dev # 本次訪問的配置項
label: master
uri: http://config-3344.com:3344 # 本微服務啟動后先去找到 3344 微服務,通過SpringCloudConfigServer
application.yml
spring:
application:
name: microservicecloud-config-client
修改hosts文件 127.0.0.1 client-config.com
在com.uos.springcloud.rest下新建ConfigClientRest類
@RestController public class ConfigClientRest { @Value("${spring.application.name}") private String applicationName; @Value("${eureka.client.service-url.defaultZone}") private String eurekaServer; @Value("${server.port}") private String serverPort; @RequestMapping("/config") public String getConfig(){ String str = "application: " + applicationName + "\t eurekaServers:" + eurekaServer + " \t serverPort" + serverPort; System.out.println(str); return str; } }
主啟動類
測試
Config項目實戰
git配置文件本地配置
microservicecloud-config-eureka-client.yml
文件地址 https://github.com/Amonologue129/microservicecloud-config/blob/master/microservicecloud-config-eureka-client.yml
microservicecloud-config-dept-client.yml
文件地址 https://github.com/Amonologue129/microservicecloud-config/blob/master/microservicecloud-config-dept-client.yml
config版的Eureka服務端
新建microservicecloud-config-eureka-client-7001
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservicecloud</artifactId> <groupId>com.uos.springcloud</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservicecloud-config-eureka-client-7001</artifactId> <dependencies> <!-- eureka-server注冊中心 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <!-- config配置中心 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!-- 熱部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
主啟動類
bootstrap.yml
## application.yml 是用戶級別的資源配置項
## bootstrap.yml 是系統級別的。優先級更高
spring:
cloud:
config:
name: microservicecloud-config-eureka-client # 需要從git 上讀取的資源名稱,注意沒有yml后綴
profile: dev # 本次訪問的配置項
label: master
uri: http://config-3344.com:3344 # 本微服務啟動后先去找到 3344 微服務,通過SpringCloudConfigServer
application.yml
spring:
application:
name: microservicecloud-config-eureka-client
Config的Eureka微服務
參考之前的8001新建microservicecloud-config-dept-client-8001
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>microservicecloud</artifactId> <groupId>com.uos.springcloud</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservicecloud-config-dept-client-8001</artifactId> <dependencies> <dependency><!-- 引入自己定義的api通用包,可以使用Dept部門Entity --> <groupId>com.uos.springcloud</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- 修改后立即生效,熱部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!-- 將微服務provider注冊進eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>
bootstrap.yml
## application.yml 是用戶級別的資源配置項
## bootstrap.yml 是系統級別的。優先級更高
spring:
cloud:
config:
name: microservicecloud-config-dept-client # 需要從git 上讀取的資源名稱,注意沒有yml后綴
profile: dev # 本次訪問的配置項
label: master
uri: http://config-3344.com:3344 # SpringCloudConfig獲取的服務地址
application.yml
spring:
application:
name: microservicecloud-config-dept-client
其余文件,直接復制microservicecloud-provider-dept-8001