1. 程式人生 > 實用技巧 >SpringCloud簡介及使用

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);
    }
}