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);
}
}
浙公網安備 33010602011771號