精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何使用Spring Cloud構建微服務架構?(文末贈書)

開發 架構 開發工具
微服務架構模式的核心在于如何識別服務的邊界,設計出合理的微服務。但如果要將微服務架構運用到生產項目上,并且能夠發揮該架構模式的重要作用,則需要微服務框架的支持。

 微服務架構模式的核心在于如何識別服務的邊界,設計出合理的微服務。

但如果要將微服務架構運用到生產項目上,并且能夠發揮該架構模式的重要作用,則需要微服務框架的支持。

在 Java 生態圈,目前使用較多的微服務框架就是集成了包括 Netflix OSS 以及 Spring Cloud。

它包括:

  • Spring Cloud Config:配置管理工具,支持使用 Git 存儲配置內容,可以實現應用配置的外部化存儲,支持客戶端配置信息刷新、加密/解密配置內容等。
  • Spring Cloud Netflix:對 Netflix OSS 進行了整合。

其中又包括:

Eureka:服務治理組件,包含服務注冊中心、服務注冊與發現。

Hystrix:容器管理組件,實現斷路器模式,倘若依賴的服務出現延遲或故障,則提供強大的容錯功能。

Ribbon:客戶端負載均衡的服務調用組件。

Feign:基于 Ribbon 和 Hystrix 的聲明式服務調用組件。

Zuul:網關組件,提供智能路由、訪問過濾等功能。

Archaius:外部化配置組件。

  • Spring Cloud Bus:事件、消息總線。
  • Spring Cloud Cluster:針對 ZooKeeper、Redis、Hazelcast、Consul 的選舉算法和通用狀態模式的實現。
  • Spring Cloud Cloudfoundry:與 Pivotal Cloudfoundry 的整合支持。
  • Spring Cloud Consul:服務發現與配置管理工具。
  • Spring Cloud Stream:通過 Redis、Rabbit 或者 Kafka 實現的消息驅動的微服務。
  • Spring Cloud AWS:簡化和整合 Amazon Web Service。
  • Spring Cloud Security:安全工具包,提供 Zuul 代理中對 OAuth2 客戶端請求的中繼器。
  • Spring Cloud Sleuth:Spring Cloud 應用的分布式跟蹤實現,可以整合 Zipkin。
  • Spring Cloud ZooKeeper:基于 ZooKeeper 的服務發現與配置管理組件。
  • Spring Cloud Starters:Spring Cloud 的基礎組件,是基于 Spring Boot 風格項目的基礎依賴模塊。
  • Spring Cloud CLI:用于在 Groovy 中快速創建 Spring Cloud 應用的 Spring Boot CLI 插件。

服務治理

當一個系統的微服務數量越來越多的時候,我們就需要對服務進行治理,提供統一的服務注冊中心,然后在其框架下提供發現服務的功能。

這樣就避免了對多個微服務的配置,以及微服務之間以及與客戶端之間的耦合。

Spring Cloud Eureka 是對 Netflix Eureka 的包裝,用以實現服務注冊與發現。

Eureka 服務端即服務注冊中心,支持高可用配置。它依托強一致性提供良好的服務實例可用性,并支持集群模式部署。

Eureka 客戶端則負責處理服務的注冊與發現。客戶端服務通過 annotation 與參數配置的方式,嵌入在客戶端應用程序代碼中。

在運行應用程序時,Eureka 客戶端向注冊中心注冊自身提供的服務,并周期性地發送心跳更新它的服務租約。

搭建服務注冊中心

服務注冊中心是一個獨立部署的服務(你可以認為它也是一個微服務),所以需要單獨為它創建一個項目,并在 pom.xml 中添加 Eureka 的依賴:

  1. <dependency> 
  2.     <groupId>org.springframework.cloud</groupId> 
  3.     <artifactId>spring-cloud-starter-eureka-server</artifactId> 
  4. </dependency> 

創建 Spring Boot Application:

  1. @EnableEurekaServer 
  2. @SpringBootApplication 
  3. public class Application { 
  4.     public static void main(String[] args) { 
  5.         new SpringApplicationBuilder(Application.class).web(true).run(args); 
  6.     } 

注冊服務提供者

要讓自己編寫的微服務能夠注冊到 Eureka 服務器中,需要在服務的 Spring Boot Application 中添加 @EnableDiscoveryClient 注解,如此才能讓 Eureka 服務器發現該服務。

當然,pom.xml 文件中也需要添加相關依賴:

  1. <dependency> 
  2.     <groupId>org.springframework.cloud</groupId> 
  3.     <artifactId>spring-cloud-starter-eureka</artifactId> 
  4. </dependency> 

同時,我們還需要為服務命名,并指定地址。這些信息都可以在 application.properties 配置文件中配置:

  1. spring.application.name=demo-service 
  2.  
  3. eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ 

說明:Spring 更推薦使用 yml 文件來維護系統的配置,yml 文件可以體現出配置節的層次關系,表現力比單純的 key-value 形式更好。

如果結合使用后面講到的 Spring Cloud Config,則客戶端的配置文件必須命名為 bootstrap.properties 或者 bootstrap.yml。

與上述配置相同的 yml 文件配置為:

  1. spring: 
  2.   application: 
  3.     name: demo-service 
  4.  
  5. eureka: 
  6.   client: 
  7.     serviceUrl:  
  8.       defaultZone: http://localhost:1111/eureka/ 

服務發現與消費

在微服務架構下,許多微服務可能會扮演雙重身份:

  • 一方面它是服務的提供者
  • 另一方面它又可能是服務的消費者

注冊在 Eureka Server 中的微服務可能會被別的服務消費。此時,就相當于在服務中創建另一個服務的客戶端,并通過 RestTemplate 發起對服務的調用。

為了更好地提高性能,可以在服務的客戶端引入 Ribbon,作為客戶端負載均衡。

現在假定我們要為 demo-service 創建一個服務消費者 demo-consumer。該消費者自身也是一個 Spring Boot 微服務,同時也能夠被 Eureka 服務器注冊。

這時,就需要在該服務的 pom.xml 中添加 Eureka 與 Ribbon 的依賴:

  1. <dependency> 
  2.     <groupId>org.springframework.cloud</groupId> 
  3.     <artifactId>spring-cloud-starter-eureka</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.     <groupId>org.springframework.cloud</groupId> 
  7.     <artifactId>spring-cloud-starter-ribbon</artifactId> 
  8. </dependency> 

 

然后在主應用類 ConosumerApplication 中注入 RestTemplate,并引入 @LoadBalanced 注解開啟客戶端負載均衡:

  1. @EnableDiscoveryClient 
  2. @SpringBootApplication 
  3. public class ConsumerApplication { 
  4.     @Bean 
  5.     @LoadBalanced 
  6.     RestTemplate restTemplate() { 
  7.         return new RestTemplate(); 
  8.     } 
  9.     public static void main(String[] args) { 
  10.         SpringApplication.run(ConsumerApplication.class, args) 
  11.     } 

 

假設消費 demo-service 的客戶端代碼寫在 demo-consumer 服務的其中一個 Controller 中:

  1. @RestController 
  2. public class ConsumerController { 
  3.     @Autowired 
  4.     RestTemplate restTemplate; 
  5.  
  6.     @RequestMapping(value = "/demo-consumer", method = RequestMethod.Get) 
  7.     public String helloConsumer() { 
  8.         return restTemplate.getForEntity("http://demo-service/demo", String.class).getBody();  
  9.     } 

 

通過 RestTemplate 就可以發起對 demo-service 的消費調用。

聲明式服務調用

通過 Ribbon 和 Hystrix 可以實現對微服務的調用以及容錯保護,但 Spring Cloud 還提供了另一種更簡單的聲明式服務調用方式,即 Spring Cloud Feign。

Feign 實際上就是對 Ribbon 與 Hystrix 的進一步封裝。通過 Feign,我們只需創建一個接口并用 annotation 的方式配置,就可以完成對服務供應方的接口(REST API)綁定。

假設我們有三個服務:

  • Notification Service
  • Account Service
  • Statistics Service

服務之間的依賴關系如下圖所示:

要使用 Feign 來完成聲明式的服務調用,需要在作為調用者的服務中創建 Client。

Client 通過 Eureka Server 調用注冊的對應服務,這樣可以解除服務之間的耦合。

結構如下圖所示:

為了使用 Feign,需要對應微服務的 pom.xml 文件中添加如下依賴:

  1. <dependency> 
  2.     <groupId>org.springframework.cloud</groupId> 
  3.     <artifactId>spring-cloud-starter-feign</artifactId> 
  4. </dependency> 

 

同時,還需要在被消費的微服務 Application 中添加 @EnableFeignClients 注解。

例如在 Statistics 服務的應用程序類中:

  1. @SpringBootApplication 
  2. @EnableDiscoveryClient 
  3. @EnableFeignClients 
  4. public class StatisticsApplication { 
  5.     public static void main(String[] args) { 
  6.         SpringApplication.run(StatisticsApplication.class, args); 
  7.     } 

 

由于 Account 服務需要調用 Statistics 服務,因此需要在 Account 服務項目中增加對應的 Client 接口:

  1. @FeignClient(name = "statistics-service"
  2. public interface StatisticsServiceClient { 
  3.  
  4.     @RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) 
  5.     void updateStatistics(@PathVariable("accountName") String accountName, Account account); 
  6.  

 

StatisticsServiceClient 接口的 updateStatistics() 方法會調用 URI 為 /statistics/{accountName} 的 REST 服務,且 HTTP 動詞為 put。

這個服務對應的就是 Statistics Service 中 StatisticsController 類中的 saveStatistics() 方法:

  1. @RestController 
  2. public class StatisticsController { 
  3.  
  4.     @Autowired 
  5.     private StatisticsService statisticsService; 
  6.  
  7.     @RequestMapping(value = "/{accountName}", method = RequestMethod.PUT) 
  8.     public void saveStatistics(@PathVariable String accountName, @Valid @RequestBody Account account) { 
  9.         statisticsService.save(accountName, account); 
  10.     } 

 

在 Account 服務中,如果要調用 Statistics 服務,都應該通過 StatisticsServiceClient 接口進行調用。

例如,Account 服務中的 AccountServiceImpl 要調用 updateStatistics() 方法,就可以在該類的實現中通過 @autowired 注入 StatisticsServiceClient 接口:

  1. @Service 
  2. public class AccountServiceImpl implements AccountService { 
  3.     @Autowired 
  4.     private StatisticsServiceClient statisticsClient; 
  5.  
  6.     @Autowired 
  7.     private AccountRepository repository; 
  8.  
  9.     @Override 
  10.     public void saveChanges(String name, Account update) { 
  11.  
  12.         //... 
  13.         statisticsClient.updateStatistics(name, account); 
  14.     } 

 

Notification 服務對 Account 服務的調用如法炮制。

服務容錯保護

在微服務架構中,微服務之間可能存在依賴關系,例如 Notification Service 會調用 Account Service,Account Service 調用 Statistics Service。

真實產品中,微服務之間的調用會更加尋常。倘若上游服務出現了故障,就可能會因為依賴關系而導致故障的蔓延,最終導致整個系統的癱瘓。

Spring Cloud Hystrix 通過實現斷路器(Circuit Breaker)模式以及線程隔離等功能,實現服務的容錯保護。

仍然參考前面的例子,現在系統的微服務包括:

  • 上游服務:demo-service
  • 下游服務:demo-consumer
  • Eureka 服務器:eureka-server

假設上游服務可能會出現故障,為保證系統的健壯性,需要在下游服務中加入容錯包含功能。

首先需要在 demo-consumer 服務中添加對 Hystrix 的依賴:

  1. <dependency> 
  2.     <groupId>org.springframework.cloud</groupId> 
  3.     <artifactId>spring-cloud-starter-hystrix</artifactId> 
  4. </dependency> 

 

然后在 demo-consumer 的應用程序類中加入 @EnableCircuitBreaker 開啟斷路器功能:

  1. @EnableCircuitBreaker 
  2. @EnableDiscoveryClient 
  3. @SpringBootApplication 
  4. public class ConsumerApplication { 
  5.     @Bean 
  6.     @LoadBalanced 
  7.     RestTemplate restTemplate() { 
  8.         return new RestTemplate(); 
  9.     } 
  10.     public static void main(String[] args) { 
  11.         SpringApplication.run(ConsumerApplication.class, args) 
  12.     } 

 

注意:Spring Cloud 提供了 @SpringCloudApplication 注解簡化如上代碼。該注解事實上已經包含了前面所述的三個注解。

@SpringCloudApplication 注解的定義如下所示:

  1. @Target(ElementType.TYPE) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. @Inherited 
  5. @SpringBootApplication 
  6. @EnableDiscoveryClient 
  7. @EnableCircuitBreaker 
  8. public @interface SpringCloudApplication {} 

 

接下來,需要引入一個新的服務類來封裝 Hystrix 提供的斷路器保護功能,主要是定義當故障發生時需要執行的回調邏輯,即代碼中指定的 fallbackMethod:

  1. @Service 
  2. public class ConsumerService { 
  3.     @Autowired 
  4.     RestTemplate restTemplate; 
  5.  
  6.     @HystrixCommand(fallbackMethod = "consumerFallback"
  7.     public String consume() { 
  8.         return restTemplate.getForEntity("http://demo-service/demo", String.class).getBody();  
  9.     } 
  10.  
  11.     public String consumerFallback() { 
  12.         return "error"
  13.     } 
  14.  
  15. @RestController 
  16. public class ConsumerController { 
  17.     @Autowired 
  18.     ConsumerService consumerService; 
  19.  
  20.     @RequestMapping(value = "/demo-consumer", method = RequestMethod.Get) 
  21.     public String helloConsumer() { 
  22.         return consumerService.consume();  
  23.     } 

 

服務監控

微服務架構將服務的粒度分解的足夠細,這使得它在保證服務足夠靈活、足夠獨立的優勢下,也帶來了管理和監控上的挑戰,服務與服務之間的依賴也變得越來越復雜。因此,對服務健康度和運行指標的監控就變得非常重要。

Hystrix 提供了 Dashboard 用以監控 Hystrix 的各項指標信息。為了監控整個系統的微服務,我們需要為 Hystrix Dashboard 建立一個 Spring Boot 微服務。

在該服務項目的 pom 文件中,添加如下依賴:

  1. <dependency> 
  2.     <groupId>org.springframework.cloud</groupId> 
  3.     <artifactId>spring-cloud-starter-hystrix</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.     <groupId>org.springframework.cloud</groupId> 
  7.     <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> 
  8. </dependency> 
  9. <dependency> 
  10.     <groupId>org.springframework.cloud</groupId> 
  11.     <artifactId>spring-cloud-starter-actuator</artifactId> 
  12. </dependency> 

 

服務的 Application 類需要添加 @EnableHystrixDashboard,以啟用 Hystrix Dashboard 功能。

同時,可能需要根據實際情況修改 application.properties 配置文件,例如選擇可用的端口號等。

如果要實現對集群的監控,則需要加入 Turbine。

API 網關

理論上,客戶端可以直接向每個微服務直接發送請求。但是這種方式是存在挑戰和限制的,調用者需要知道所有端點的地址,分別對每一段信息執行 http 請求,然后將結果合并到客戶端。

一般而言,針對微服務架構模式的系統,采用的都是前后端分離的架構。為了明顯地隔離開前端與后端的邊界,我們通常可以專門為前端的消費者定義更加粗粒度的 Open Service。

這些 Open Service 是對外的 RESTful API 服務,可以通過 F5、Nginx 等網絡設備或工具軟件實現對各個微服務的路由與負載均衡,并公開給外部的客戶端調用(注意,內部微服務之間的調用并不需要通過 Open Service)。

這種對外公開的 Open Service 通常又被稱為邊緣服務(edge service)。

如果這些 Open Service 需要我們自己去開發實現并進行服務的運維,在系統規模不斷增大的情況下,會變得越來越困難。

例如,當增加了新的微服務又或者 IP 地址發生變動時,都需要運維人員手工維護這些路由規則與服務實例列表。

又例如針對所有垂直分隔的微服務,不可避免存在重用的橫切關注點,例如用戶身份認證、授權或簽名校驗等機制。

我們不能在所有微服務中都去添加這些相同的功能,因為這會造成橫切關注點的冗余。

解決的辦法是引入 API 網關(API Gateway)。它是系統的單個入口點,用于通過將請求路由到適當的后端服務或者通過調用多個后端服務并聚合結果來處理請求。

此外,它還可以用于認證、insights、壓力測試、金絲雀測試(canary testing)、服務遷移、靜態響應處理和主動變換管理。

Spring Cloud 為 API 網關提供的解決方案就是 Spring Cloud Zuul,它是對 Netflix Zuul 的包裝。

路由規則與服務實例維護

Zuul 解決路由規則與服務實例維護的方法是通過 Spring Cloud Eureka。

API Gateway 自身就是一個 Spring Boot 服務,該服務自身被注冊為 Eureka 服務治理下的應用,同時它會從 Eureka 中獲得所有其他微服務的實例信息。

這樣的設計符合 DRY 原則,因為 Eureka 已經維護了一套服務實例信息,Zuul 直接重用了這些信息,無需人工介入。

對于路由規則,Zuul 默認會將服務名作為 ContextPath 創建路由映射,基本上這種路由映射機制就可以滿足微服務架構的路由需求。

倘若需要一些特殊的配置,Zuul 也允許我們自定義路由規則,可以通過在 API 網關的 Application 類中創建 PatternServiceRouteMapper 來定義自己的規則。

橫切關注點

諸如授權認證、簽名校驗等業務邏輯本身與微服務應用所要處理的業務邏輯沒有直接關系,我們將這些可能橫跨多個微服務的功能稱為“橫切關注點”。這些橫切關注點往往會作為“裝飾”功能在服務方法的前后被調用。

Spring Cloud Zuul 提供了一套過濾器機制,允許開發者創建各種過濾器,并指定哪些規則的請求需要執行哪個過濾器。

自定義的過濾器繼承自 ZuulFilter 類。例如我們要求客戶端發過來的請求在路由之前需要先驗證請求中是否包含 accessToken 參數。

如果有就進行路由,否則就拒絕,并返回 401 Unauthorized 錯誤,則可以定義 AccessFilter 類:

  1. public class AccessFilter extends ZuulFilter { 
  2.     private static Logger log = LoggerFactory.getLogger(AccessFilter.class); 
  3.  
  4.     @Override 
  5.     public String filterType() { 
  6.         return "pre" 
  7.     } 
  8.  
  9.     @Override 
  10.     public int filterOrder() { 
  11.         return 0; 
  12.     } 
  13.  
  14.     @Override 
  15.     public boolean shouldFilter() { 
  16.         return true
  17.     } 
  18.  
  19.     @Override 
  20.     public Object run() { 
  21.         RequestContext ctx = RequestContext.getCurrentContext(); 
  22.         HttpServletRequest request = ctx.getRequest(); 
  23.  
  24.         log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString()); 
  25.  
  26.         Object accessToken = request.getParameter("accessToken"); 
  27.         if (accessToken == null) { 
  28.             log.warn("access token is empty"); 
  29.             ctx.setSendZuulResponse(false); 
  30.             ctx.setResponseStatusCode(401); 
  31.             return null
  32.         } 
  33.         log.info("access token ok"); 
  34.         return null
  35.     } 

 

要讓該自定義過濾器生效,還需要在 Zuul 服務的 Application 中創建具體的 Bean:

  1. @EnableZuulProxy 
  2. @SpringCloudApplication 
  3. public class ZuulApplication { 
  4.     public static void main(String[] args) { 
  5.         new SpringApplicatonBuilder(ZuulApplication.class).web(true).run(args); 
  6.     } 
  7.  
  8.     @Bean 
  9.     public AccessFilter accessFilter() { 
  10.         return new AccessFilter(); 
  11.     } 

 

Zuul 一共提供了四種過濾器:

  • pre filter
  • routing filter
  • post filter
  • error filter

下圖來自官網,它展現了客戶端請求到達 Zuul API 網關的生命周期與過濾過程:

通過 starter 添加 Zuul 的依賴時,自身包含了 spring-cloud-starter-hystrix 與 spring-cloud-starter-ribbon 模塊的依賴,因此 Zuul 自身就擁有線程隔離與斷路器的服務容錯功能,以及客戶端負載均衡。

但是,倘若我們使用 path 與 url 的映射關系來配置路由規則,則路由轉發的請求并不會采用 HystrixCommand 來包裝,因而這類路由是沒有服務容錯與客戶端負載均衡作用的。

所以在使用 Zuul 時,應盡量使用 path 和 serviceId 的組合對路由進行配置。

分布式配置中心

為什么要引入一個分布式配置中心?一個微服務就需要至少一個配置文件,怎么管理分散在各個微服務中的配置文件呢?如果微服務采用的是不同的技術棧,如何來統一微服務的配置呢?

微服務是部署在不同的節點中,顯然我們無法在單機中實現對分布式節點的配置管理。這就是引入 Spring Cloud Config 的目的。

Spring Cloud Config 提供了服務端和客戶端支持。服務端是一個獨立的微服務,同樣可以注冊到 Eureka 服務器中。

每個需要使用分布式配置中心的微服務都是 Spring Cloud Config 的客戶端。

Spring Cloud Config 默認實現基于 Git 倉庫,既可以進行版本管理,還可以通過本地 Git 庫起到緩存作用。

Spring Cloud Config 不限于基于 Spring Cloud 開發的系統,而是可以用于任何語言開發的程序,并支持自定義實現。

配置中心服務端

Spring Cloud Config Server 作為配置中心服務端,提供如下功能:

  • 拉取配置時更新 Git 倉庫副本,保證是***結果。
  • 支持數據結構豐富,yml,json,properties 等。
  • 配合 Eureke 可實現服務發現,配合 cloud bus 可實現配置推送更新。
  • 配置存儲基于 Git 倉庫,可進行版本管理。
  • 簡單可靠,有豐富的配套方案。

建立一個 Config 服務,需要添加如下依賴:

  1. <dependency> 
  2.     <groupId>org.springframework.cloud</groupId> 
  3.     <artifactId>spring-cloud-config-server</artifactId> 
  4. </dependency> 

 

服務的 Application 類需要添加 @EnableConfigServer 注解:

  1. @SpringBootApplication 
  2. @EnableConfigServer 
  3. public class ConfigApplication { 
  4.  
  5.     public static void main(String[] args) { 
  6.         SpringApplication.run(ConfigApplication.class, args); 
  7.     } 

 

配置服務的基本信息和 Git 倉庫的信息放在 application.yml 文件中:

  1. spring: 
  2.   cloud: 
  3.     config: 
  4.       server: 
  5.         git: 
  6.             uri: http://localhost/workspace/springcloud-demo 
  7.             username: user 
  8.             passwordpassword 
  9.  
  10. server: 
  11.   port: 8888 
  12.  
  13. security: 
  14.   user
  15.     password: ${CONFIG_SERVICE_PASSWORD} 

 

Git 庫與配置服務

在 Config 服務中配置了 Git 服務器以及 Git 庫的信息后,我們就可以在 Git 庫中提交配置文件。

存儲在Git 庫中配置文件的名字以及分支名(默認為 master 分支)會組成訪問 Config 服務的 URI。

假設有一個服務為 Notification 服務,則它在配置中心服務端的配置文件為 notification-dev.yml,內容如下:

  1. devMode:  true 
  2. spring: 
  3.     application: 
  4.         name: notification 
  5.     jdbc: 
  6.         host: localhost 
  7.         port: 3306 
  8.         user: root 
  9.         password: 123456 
  10. logging: 
  11.     file: demo 

 

配置中心客戶端

需要讀取配置中心服務端信息的微服務都是配置中心的客戶端,為了能夠讀取配置服務端的信息,這些微服務需要:

  • 在 pom 中添加對 spring-cloud-starter-config 的依賴。
  • 在 bootstrap.properties 或者 bootstrap.yml 中配置獲取配置的 config-server 位置。

例如,Account 服務的配置是由 Spring Cloud Config 進行管理的。在它的資源目錄下,提供了 bootstrap.yml 配置文件,內容如下所示:

  1. spring: 
  2.   application: 
  3.     name: account-service 
  4.   cloud: 
  5.     config: 
  6.       uri: http://config:8888 
  7.       fail-fast: true 
  8.       password: ${CONFIG_SERVICE_PASSWORD} 
  9.       username: user 

 

注意,該配置文件除了配置了該 Account 服務應用的 name 之外,主要是支持該應用獲得配置服務端的信息。

微服務自身的配置信息則統一放到配置中心服務端的文件中,并由 Git 庫進行管理。

例如,Account 服務的詳細配置在配置中心服務端的 account-dev.yml 文件中:

  1. security: 
  2.   oauth2: 
  3.     client: 
  4.       clientId: account-service 
  5.       clientSecret: ${ACCOUNT_SERVICE_PASSWORD} 
  6.       accessTokenUri: http://auth-service:5000/uaa/oauth/token 
  7.       grant-type: client_credentials 
  8.       scope: server 
  9.  
  10. spring: 
  11.   data: 
  12.     mongodb: 
  13.       host: account-mongodb 
  14.       username: user 
  15.       password: ${MONGODB_PASSWORD} 
  16.       database: piggymetrics 
  17.       port: 27017 
  18.  
  19. server: 
  20.   context-path: /accounts 
  21.   port: 6000 

 

Spring Cloud Config 通過 Git 實現分布式的配置管理。當配置中心服務端的配置信息發生變更時,各個作為配置客戶端的微服務會向 Git 庫提交 pull 更新,獲得***的配置信息。

當然,Spring Cloud Config 還可以使用 SVN 庫進行配置管理,也支持簡單的本地文件系統的存儲方式。

此時需要將 spring.profiles.active 設置為 native,并設置搜索配置文件的路徑。如果不配置路徑,默認在 src/main/resources 目錄下搜索。

如下配置文件:

  1. spring: 
  2.   cloud: 
  3.     config: 
  4.       server: 
  5.         native: 
  6.           search-locations: classpath:/shared 
  7.   profiles: 
  8.     active: native 

 

搜索路徑放在 classpath 下的 shared 目錄下,那么在代碼中,目錄就是 resources/shared。

如果使用本地文件系統管理配置文件,則無法支持分布式配置管理以及版本管理,因此在生產系統下,還是推薦使用 Git 庫的方式。

總結

在實施微服務時,我們可以將微服務視為兩個不同的邊界:

  • 一個是與前端 UI 的通信,稱為 Open Service(Edge Service),通過引入 API Gateway 來實現與前端UI的通信。
  • 另一個是在邊界內業務微服務之間的通信,通過 Feign 實現微服務之間的協作。

所有的微服務都會通過 Eureka 來完成微服務的注冊與發現。一個典型的基于 Spring Cloud 的微服務架構如下所示:

微服務的集成可以通過 Feign+Ribbon 以 RESTful 方式實現通信,也可以基于 RPC 方式(可以結合 Protocol Buffer)完成服務之間的通信,甚至可以通過發布事件與訂閱事件的機制。

事件機制可以使微服務之間更加松散耦合。這時,我們可以引入 RabbitMQ 或 Kafka 來做到服務與服務之間的解耦。

事件機制是異步和非阻塞的,在某些業務場景下,它的性能會更加的好。Spring Cloud 也提供了相關的組件 Spring Cloud Stream 來支持這種事件機制。

對于微服務之間的協作,到底選擇 Feign 這種 REST 方式、事件機制或者 RPC 方式,取決于業務場景是否需要同步方式,還是異步方式;是高性能高并發,還是普通方式;是要求徹底解耦,還是做到一般的松散耦合。

我們需要針對實際情況作出實際的判斷,作出正確的選擇。沒有誰壞誰好之分,而是看誰更加的適合。

作者:張逸

簡介:架構編碼實踐者,IT 文藝工作者,大數據平臺架構師,兼愛 OO 與 FP,熱衷于編程語言學習與技藝提升,致力于將主流領域驅動設計與函數式編程、響應式編程以及微服務架構***結合。他的個人微信公眾號為「逸言」,個人博客:http://zhangyi.xyz。

福利來啦

你覺得搭建一套微服務系統難點在哪?掃描下方二維碼,關注51CTO技術棧公眾號。歡迎在技術棧微信公眾號留言探討。小編將選出留言最精彩的6名網友,送出《Spring Cloud微服務架構開發實戰》圖書一本~活動截止時間 7 月 12 日十二時整,特別鳴謝北京大學出版社為本次活動提供的圖書贊助。

書籍簡介

新。本書案例基于全新的 Spring Boot 2.0 及 Spring Cloud Finchley.M2,深入淺出地講解了 Spring Cloud。

實戰。跳脫純理論講述,案例貫穿全書,從 0 到 1 搭建微服務系統,從 1 到 0 實現微服務拆分。讀者不僅能全面學到軟件開發技能,還能學到項目實戰經驗。

全。彌補市面上有關 Spring Cloud 學習資料的不足,重新編寫整個教學案例,使讀者輕松脫離“Hello World”階段,實現對微服務的治理。

 

 

責任編輯:武曉燕 來源: 張逸博客
相關推薦

2017-06-26 09:06:10

Spring Clou微服務架構

2017-09-04 16:15:44

服務網關架構

2017-08-10 11:15:05

Spring Clou微服務架構

2017-08-09 15:50:47

Spring Clou微服務架構

2017-07-03 09:50:07

Spring Clou微服務架構

2017-12-20 15:37:39

Spring Clou微服務架構

2024-07-10 10:51:39

SpringEureka數據中心

2017-07-04 17:35:46

微服務架構Spring Clou

2018-03-02 16:11:29

Spring Clou分布式服務跟蹤

2017-06-25 13:33:25

Spring Clou微服務架構

2018-04-09 13:56:13

微服務架構分布式

2018-04-02 15:01:31

微服務架構分布式服務

2018-03-13 16:42:26

分布式服務跟蹤

2017-09-09 23:15:20

Spring Clou微服務架構路由

2018-04-18 16:07:49

Spring Clou微服務分布式

2018-04-16 14:56:56

微服務架構分布式服務

2017-07-28 16:41:53

Spring Clou微服務架構

2024-02-06 18:05:54

微服務SpringCloud

2017-09-15 23:29:53

Spring Clou微服務架構過濾器

2018-05-23 15:58:27

Spring Clou微服務架構
點贊
收藏

51CTO技術棧公眾號

国产精品亚洲第一| 90岁老太婆乱淫| 免费一级黄色大片| 日韩欧美看国产| 国产精品1区2区3区| 国产性猛交xxxx免费看久久| 国产色婷婷国产综合在线理论片a| 97超碰人人看| 成年在线观看免费人视频| 高清久久一区| 国产网站一区二区三区| 国产69精品久久久| 午夜诱惑痒痒网| 在线观看xxx| 女人天堂亚洲aⅴ在线观看| 在线观看免费一区| 久久久久久九九| 国产一级在线观看视频| 国产精品日韩精品在线播放 | 色综合久久中文字幕| 97超碰人人模人人爽人人看| 美女av免费看| 欧美日韩精品免费观看视欧美高清免费大片 | 极品国产人妖chinesets亚洲人妖| 国产精品剧情在线亚洲| 国产成人精品一区| 国产美女永久免费无遮挡 | 国产国语videosex另类| 日韩欧美中文字幕视频| 麻豆精品国产| 亚洲欧美日韩系列| 91网站在线看| 亚洲熟女www一区二区三区| 日韩免费电影在线观看| 懂色av影视一区二区三区| 好吊妞www.84com只有这里才有精品| 欧美成人片在线观看| 精品国产一区二区三区香蕉沈先生 | 日韩国产高清在线| 亚洲网站在线播放| 人体私拍套图hdxxxx| 国产精品yjizz视频网| jlzzjlzz亚洲日本少妇| 欧美一区二区三区精品电影| 在线免费观看黄色小视频| 超碰一区二区| 中文字幕av在线一区二区三区| 国产欧美日韩免费| 小向美奈子av| 中文无码日韩欧| 午夜精品福利视频网站| 欧美性xxxx69| 在线观看色网站| 欧美在线网址| www.日韩av.com| 无码人妻少妇色欲av一区二区| 日本欧美一区| 欧洲国产伦久久久久久久| 欧美日韩在线不卡视频| 香蕉视频免费在线播放| 国产高清久久久久| 亚洲www视频| 在线观看黄网站| 日韩中文首页| 亚洲国产精品美女| 欧美精品久久久久久久久25p| 国产1区在线| 9l国产精品久久久久麻豆| 国产精品一区二区三区在线观| 一级做a爰片久久毛片| 天天影视欧美综合在线观看| 亚洲国产成人久久| 国产一伦一伦一伦| 男人亚洲天堂| 欧美日韩在线免费| 国产免费成人在线| 偷拍精品精品一区二区三区| 欧美午夜一区二区| 少妇高潮喷水在线观看| av在线电影网| 中文字幕一区二区三区视频| 久久精品二区| 激情在线视频| www.欧美日韩| 欧美三级网色| 日本a在线播放| 26uuu亚洲婷婷狠狠天堂| 亚洲自拍偷拍区| 蜜臀久久精品久久久久| 国内精品自线一区二区三区视频| 欧美一级黑人aaaaaaa做受| www亚洲视频| 在线免费观看欧美| 久久在线免费观看视频| 69视频在线观看免费| 国产精品久久久久蜜臀| 久久久午夜视频| 在线免费观看国产精品| 免费视频一区二区三区在线观看| 萌白酱国产一区二区| 日本女人性生活视频| 狠狠色狠狠色综合婷婷tag| 亚洲二区在线播放视频| 亚洲色成人网站www永久四虎 | 国产视频精品网| 国产美女永久免费| 久久精品久久综合| 国产精品美女久久久免费| 久久久久在线视频| 国产美女一区二区三区| 国产中文字幕91| 欧美一级一区二区三区| 国产精品三级视频| 国产肥臀一区二区福利视频| www在线观看黄色| 欧美日韩一卡二卡三卡| 成人亚洲精品777777大片| 久久99久久99精品免观看软件| 欧美日韩国产精品| 日韩在线一区视频| 婷婷激情成人| 欧美日韩精品三区| 色一情一区二区| 成人黄色免费观看| 欧美男男青年gay1069videost | 久久久久久九九| 欧美色图天堂| 一区二区三区美女视频| www婷婷av久久久影片| 牛牛精品视频在线| 3d动漫精品啪啪一区二区竹菊| 亚洲精品mv在线观看| 免费观看性欧美大片无片| 亚洲天堂男人天堂女人天堂| 日韩av电影网址| 模特精品在线| 国产精品一区二区3区| 天堂资源中文在线| 欧美激情一区二区在线| 中文字幕日韩精品久久| 在线中文字幕视频观看| 亚洲地区一二三色| 欧美 激情 在线| 国产一区二区三区不卡av| 亚洲国产欧美精品| 久久久久久久久97| 天堂一区二区在线| 国产精品第10页| 国产又大又黄的视频| 国产成人av电影| 免费影院在线观看一区| 日本在线观看免费| 欧美视频一区二区| 日本免费网站视频| 久久黄色级2电影| 国产91av视频在线观看| 国产盗摄一区二区| 在线观看国产日韩| 一区二区三区伦理片| 日精品一区二区三区| 欧美一进一出视频| 四虎影视国产在线视频| 91豆麻精品91久久久久久| 久久综合桃花网| 正在播放日韩欧美一页 | 偷拍视频一区二区| 免费网站在线观看人| 日韩一区二区三区高清免费看看| 亚洲天堂成人av| 香蕉国产精品| 日韩av第一页| 亚洲经典一区二区| 国产精品理论片| 女人高潮一级片| 欧美精品国产一区二区| 国产精品视频永久免费播放| xxxxx日韩| 欧美高清你懂得| 久久机热这里只有精品| 91在线看国产| 欧美日韩不卡在线视频| 国产精品亚洲欧美日韩一区在线 | a级片免费在线观看| 欧美色手机在线观看| 亚洲熟女少妇一区二区| 国产成人午夜精品5599 | 91超碰在线| 国产亚洲精品日韩| 99热这里只有精品9| 国产日韩亚洲欧美综合| 国产精欧美一区二区三区白种人| 欧美黄免费看| 日本一区视频在线观看| 亚洲欧洲日本韩国| 精品久久久久香蕉网| 一起操在线播放| 蜜臀久久99精品久久久久宅男| 久久艳妇乳肉豪妇荡乳av| 黄色日韩网站| 97国产suv精品一区二区62| 精品久久在线观看| 中文字幕综合网| 欧美美女一级片| 亚洲日本国产| 精品久久久久久综合日本| 成人全视频免费观看在线看| 久久久久久久久久久久av| 精品人妻一区二区三区麻豆91 | 91色九色蝌蚪| 手机精品视频在线| 久久一区亚洲| 日韩激情视频一区二区| 国产一区 二区| 国模精品系列视频| 激情视频在线观看| 91麻豆精品久久久久蜜臀| 天堂网av手机版| 亚洲精品日产精品乱码不卡| 别急慢慢来1978如如2| 伊人久久大香线蕉综合网蜜芽| 97超碰国产精品女人人人爽 | 亚洲精品自产拍| 久久久成人免费视频| 亚洲自拍偷拍麻豆| youjizz亚洲女人| 美女视频网站久久| 国产无套内射久久久国产| 欧美午夜电影在线观看| 欧美日韩在线免费观看视频| 精品一区二区三| 久久精品aaaaaa毛片| 粉嫩一区二区三区四区公司1| 国产在线久久久| 91欧美精品| 国产成人精品av在线| 亚洲优女在线| 69视频在线播放| 性爽视频在线| 97视频com| 是的av在线| 中文字幕欧美精品日韩中文字幕| 一区二区日韩视频| 亚洲一区二区免费视频| 污污污www精品国产网站| 久久看片网站| 两根大肉大捧一进一出好爽视频| 亚洲午夜在线| 日韩影片在线播放| 国产一区二区三区91| 日本一区视频在线| 欧美综合一区| 国产伦精品一区二区三区视频孕妇 | 欧美一区不卡| 97超碰在线视| 1000部精品久久久久久久久| 热99这里只有精品| 先锋影音久久久| 男女啪啪网站视频| 综合激情网站| 青青青青在线视频| 影音国产精品| 激情综合网婷婷| 日本成人在线不卡视频| 国产女主播av| 国产在线日韩精品| 水蜜桃亚洲精品| 99久久影视| 久久人妻无码一区二区| 99国产成+人+综合+亚洲欧美| 一区二区三区四区电影| 欧美成人一区二区在线| 国产亚洲欧美日韩在线观看一区二区| 日韩国产高清一区| 国产精品国产三级国产在线观看| 成人在线免费观看网址| 黄色另类av| 黄色一级一级片| 国产一区亚洲| 国产一区二区网| 日本欧美在线观看| 九九热视频免费| 99re这里只有精品首页| 欧美精品日韩在线| 一区二区成人在线观看| 日本中文字幕久久| 欧美一区二区三区人| 无码人妻熟妇av又粗又大| 欧美日韩激情一区二区三区| 亚洲男人天堂久久| 91精品久久久久久久99蜜桃| 亚洲免费成人在线| 亚洲夜晚福利在线观看| v天堂福利视频在线观看| 97视频在线观看免费| 国产精品99| 国产精品亚洲综合| 青青草国产免费一区二区下载 | 91精品久久久久久久久不口人| 999在线精品| 亚洲一区二区三区xxx视频| 国产伦精品一区二区三区免费优势 | 国产免费黄色片| 日韩成人免费视频| 欧美一级免费片| 中文字幕在线成人| 爱啪视频在线观看视频免费| 国产精品一区二区性色av| 精品伊人久久久| 中文字幕一区二区中文字幕| 亚洲少妇在线| 国产一区二区三区精彩视频| 精品亚洲国产成人av制服丝袜| 国产呦小j女精品视频| 夜夜嗨av一区二区三区| 又污又黄的网站| 日韩高清a**址| 特级毛片在线| 国产视频观看一区| 少妇精品久久久| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 福利视频在线导航| 国产午夜精品全部视频在线播放| 污污的网站在线免费观看| 国产精品99久久99久久久二8| 高清一区二区三区| 欧美做受777cos| 久久99精品国产91久久来源| 91视频这里只有精品| 2020国产精品自拍| 亚洲性猛交xxxx乱大交| 亚洲成av人片一区二区梦乃| www.激情五月.com| 久久久成人精品视频| 好久没做在线观看| 91精品久久久久久久久久久久久久| 成人看片毛片免费播放器| 欧美精品一区二区三区在线看午夜| 激情欧美丁香| 久久久久亚洲av无码专区首jn| 成人av网站在线观看免费| 国产ts丝袜人妖系列视频| 亚洲一区二区美女| 亚洲av无码专区在线| 欧美日韩国产999| 成人短视频app| 精品午夜一区二区三区| 亚洲乱码久久| 呦呦视频在线观看| 亚洲成人久久影院| 天天操天天干天天操| 这里只有精品视频| 精品123区| 亚洲欧美日韩精品综合在线观看| 午夜欧美精品| 日批视频在线看| 亚洲一区欧美一区| 人成网站在线观看| 7777精品久久久久久| 在线看成人短视频| 黄色三级视频片| 欧美国产精品一区二区三区| 在线免费看毛片| 菠萝蜜影院一区二区免费| 韩国一区二区三区视频| 欧美做暖暖视频| www.日韩av| 精品人妻一区二区色欲产成人| 亚洲欧美精品一区二区| 羞羞的视频在线看| 国产精品久久精品视| 一区二区久久| 亚洲自拍偷拍图| 欧美日韩国产中文| 日本欧美电影在线观看| 精品国产一区二区三区日日嗨| 性色一区二区| 久久国产高清视频| 精品1区2区在线观看| 美女免费久久| 成人自拍爱视频| 五月天久久777| 91精品人妻一区二区三区蜜桃2| 亚洲超丰满肉感bbw| 九色在线播放| 亚洲jizzjizz日本少妇| 国产欧美三级| 亚洲综合久久av一区二区三区| 欧美videos中文字幕| 高清电影一区| www.男人天堂网| 国产午夜精品理论片a级大结局| 国产视频一区二区三| 97香蕉久久超级碰碰高清版| 日韩大片在线观看| 中国极品少妇xxxx| 一个色在线综合| 你懂的在线视频| 日本精品一区二区三区在线播放视频| 久久激情电影| 激情 小说 亚洲 图片: 伦|