SpringCloud簡介及使用
https://blog.csdn.net/June_FlyingFrost/article/details/89790656
Spring cloud是一個基於Spring Boot實現的服務治理工具包,在微服務架構中用於管理和協調服務的
微服務:就是把一個單體專案,拆分為多個微服務,每個微服務可以獨立技術選型,獨立開發,獨立部署,獨立運維.並且多個服務相互協調,相互配合,最終完成使用者的價值.
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分散式系統基礎設施的開發,如服務發現註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署
五大重要元件
服務發現——Netflix Eureka
客服端負載均衡——Netflix Ribbon/Feign
服務閘道器——Netflix Zuul
斷路器——Netflix Hystrix
分散式配置——Spring Cloud Config
Spring cloud入門-搭建環境( 以maven多模組化的方法搭建)
1.建立Maven普通專案
最外層pom.xml:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR1</spring-cloud.version> <springboot.version>2.0.5.RELEASE</springboot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- 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
2.Spring cloud-Eureka註冊中心
Eureka是netflix的一個子模組,也是核心模組之一,Eureka是一個基於REST的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移
服務註冊與發現對於微服務架構來說是非常重要的,有了服務發現和註冊,只需要使用服務的識別符號,就可以訪問到服務,而不需要修改服務,而不需要修改服務呼叫的配置檔案了
1.建立Maven普通模組User_eureka_7001
2.匯入jar包
<!--springboot支援--> <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> <!--Eureka服務端支援--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
3.建立application.yml
server:
port: 7001
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false #是否要註冊到eureka
fetchRegistry: false #表示是否從Eureka Server獲取註冊資訊
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #單機配置
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
4.建立啟動類
@SpringBootApplication
@EnableEurekaServer//標識是eureka服務端
public class EnrekaServerApplication_7001 {
public static void main(String[] args) {
SpringApplication.run(EnrekaServerApplication_7001.class);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
5.啟動入庫類訪問localhost:7001
3.Spring cloud-服務提供者
1.建立一個模組存放公共程式碼User_interface
例:
2.建立服務提供者模組User_provider_8001
3.匯入jar包和公共模組依賴
<dependencies>
<!--公共程式碼依賴-->
<dependency>
<groupId>cn.itsource.springcloud</groupId>
<artifactId>User_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支援-->
<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>
<!--eureka客戶端支援 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
4.建立application.yml
server:
port: 8001
spring:
application:
name: USER-PROVIDER #不要使用下劃線
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka #告訴服務提供者要把服務註冊到哪兒
instance:
prefer-ip-address: true #顯示客戶端真實ip
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
5.建立啟動類
@SpringBootApplication
@EnableEurekaClient //表示是eureka的客戶端
public class UserProviderApplication_8001 {
public static void main(String[] args) {
SpringApplication.run(UserProviderApplication_8001.class);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
6.建立controller
@RestController
@RequestMapping("/provider")
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("/user/{id}") //user/1
public User getUser(@PathVariable("id") Long id) {
// 正常應該呼叫service獲取使用者,現在模擬一下
return new User(id, "zs");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
4.Spring cloud-服務消費者
1.建立Maven模組專案 User_consumer_9001
2.導jar包和公共模組依賴
<!--公共程式碼依賴-->
<dependency>
<groupId>cn.itsource.springcloud</groupId>
<artifactId>User_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支援-->
<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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
3.建立application.yml
server:
port: 9001
spring:
application:
name: USER_CONSUMER
- 1
- 2
- 3
- 4
- 5
4.建立啟動類
@SpringBootApplication
public class UserConsumerAppliction_9001 {
public static void main(String[] args) {
SpringApplication.run(UserConsumerAppliction_9001.class);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
5.建立一個配置bean的類CfgBean
@Configuration // <beans></beans>
public class CfgBean {
@Bean //<bean class="org.springframework.web.client.RestTemplate"></bean>
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
6.建立Controller層
@RestController
@RequestMapping("/consumer")
public class UserController {
//多個方法呼叫只需改一處就ok
public static final String URL_PREFIX = "http://localhost:8001";
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/user/{id}")
public User getUser(@PathVariable("id")Long id){
//呼叫遠端服務 http請求
String url = URL_PREFIX+"/provider/user/"+id;
return restTemplate.getForObject(url,User.class );
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
Spring cloud入門加強-註冊中心叢集
如果只有一個註冊中心伺服器,會存在單點故障所以要叢集
1.搭建叢集
1.對映hosts 模擬域名解析 C:\Windows\System32\drivers\etc
127.0.0.1 eureka-7001.com
127.0.0.1 eureka-7002.com
- 1
- 2
2.建立User_eureka_7002 ,與7001一樣
3.配置yml
7001專案的application.yml
server:
port: 7001
eureka:
instance:
hostname: eureka-7001.com
client:
registerWithEureka: false #是否要註冊到eureka
fetchRegistry: false #表示是否從Eureka Server獲取註冊資訊
serviceUrl:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #單機配置
defaultZone: http://eureka-7002.com:7002/eureka/ #叢集配置,如果有多個,有逗號分割,不要包含自己
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
7002專案的application.yml
server:
port: 7002
eureka:
instance:
hostname: eureka-7002.com
client:
registerWithEureka: false #是否要註冊到eureka
fetchRegistry: false #表示是否從Eureka Server獲取註冊資訊
serviceUrl:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #單機配置
defaultZone: http://eureka-7001.com:7001/eureka/ #叢集配置,如果有多個,有逗號分割,不要包含自己
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
4.啟動測試
5.服務提供者8001的yml修改
server:
port: 8001
spring:
application:
name: user-provider #不要使用下劃線
eureka:
client:
service-url:
#defaultZone: http://localhost:7001/eureka #告訴服務提供者要把服務註冊到哪兒
defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
instance:
prefer-ip-address: true #顯示客戶端真實ip
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
2.Spring cloud入門加強-服務消費者(負載均衡)
為了提供併發量,有時同一個服務提供者可以部署多個。這個客戶端在呼叫時要根據一定的負責均衡策略完成負載呼叫
Spring cloud中常見負載均衡實現技術
1.Ribbon負載均衡
Ribbon是Netflix釋出的雲中間層服務開源專案,主要功能是提供客戶端負載均衡演算法。Ribbon客戶端元件提供一系列完善的配置項,如,連線超時,重試等
1.建立專案 User_provider_8002,並註冊到註冊中心
2.User_consumer_9001匯入ribbon的jar包
<!--客戶端負載均衡實現 ribbon-->
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3.修改User_consumer_9001的yml
server:
port: 9001
eureka:
client:
registerWithEureka: false #不註冊到Eureka,不在註冊中心顯示
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
4.啟動類
@SpringBootApplication
@EnableEurekaClient
public class UserConsumerApplicaton_9001 {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplicaton_9001.class);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
5.修改User_consumer_9001的config包的CfgBean類
@Configuration
public class CfgBean {
@Bean
@LoadBalanced //開啟負載均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
6.修改Controller
@RestController
@RequestMapping("/consumer")
public class UserController {
//多個方法呼叫只需改一處就ok
//public static final String URL_PREFIX = "http://localhost:8001";
public static final String URL_PREFIX ="http://USER-PROVIDER"; //通過服務名從註冊中心獲取服務列表,通過負載均衡呼叫
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/user/{id}")
public User getUser(@PathVariable("id")Long id){
//呼叫遠端服務 http請求
String url = URL_PREFIX+"/provider/user/"+id;
return restTemplate.getForObject(url,User.class );
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
2.Feign負載均衡
前面的可以發現當我們通過RestTemplate呼叫其它服務的API時,所需要的引數須在請求的URL中進行拼接,如果引數少的話或許我們還可以忍受,一旦有多個引數的話,這時拼接請求字串就會效率低下,並且顯得好傻
Feign是以介面方式進行呼叫,而不是通過RestTemplate來呼叫,feign底層還是ribbo,它進行了封裝,
1.建立 User_consum_9002模組
2.到jar包
<dependencies>
<!--公共程式碼依賴-->
<dependency>
<groupId>cn.itsource.springcloud</groupId>
<artifactId>User_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支援-->
<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>
<!--eureka客戶端,服務消費者也要從註冊中心獲取可用服務列表-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--feign的支援-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
- 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
3.建立application.yml
server:
port: 9002
eureka:
client:
registerWithEureka: false #不註冊到Eureka,不在註冊中心顯示
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
4.建立啟動類
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = "cn.itsource.microservice") //不在當前包下面
public class UserConsumerFeign9002Application {
public static void main(String[] args) {
SpringApplication.run(UserConsumerFeign9002Application.class, args);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
5.建立一個介面來呼叫服務
//呼叫服務名字
@FeignClient(value = "USER-PROVIDER")
public interface UserCilent {
@RequestMapping("/provider/user/{id}") //user/1
User getUser(@PathVariable("id") Long id);
}
- 1
- 2
- 3
- 4
- 5
- 6
6.Controller層
@RestController
@RequestMapping("/consumer")
public class UserController {
@Autowired
private UserCilent userCilent;
@RequestMapping("/user/{id}")
public User getUser(@PathVariable("id")Long id){
System.out.println(userCilent.getClass());
return userCilent.getUser(id);
}
}