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

基于Spring Cloud的微服務落地

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

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

[[231374]]

在Java生態圈,目前使用較多的微服務框架就是集成了包括Netfilix OSS以及Spring的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實現的消息驅動的微服務。
  • Spirng 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. 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.             password: password 
  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方式,取決于業務場景是否需要同步方式,還是異步方式;是高性能高并發,還是普通方式;是要求徹底解耦,還是做到一般的松散耦合。我們需要針對實際情況作出實際的判斷,作出正確的選擇。沒有誰壞誰好之分,而是看誰更加的適合。

【本文為51CTO專欄作者“張逸”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-09-05 14:05:11

微服務spring clou路由

2023-12-19 09:33:40

微服務監控

2024-08-20 09:59:22

2024-02-06 18:05:54

微服務SpringCloud

2021-12-14 06:59:39

微服務Kubernetes架構

2024-08-05 10:03:53

2017-06-26 09:06:10

Spring Clou微服務架構

2017-12-20 15:37:39

Spring Clou微服務架構

2024-07-10 10:51:39

SpringEureka數據中心

2017-09-04 16:15:44

服務網關架構

2020-06-30 07:58:39

微服務Spring BootCloud

2024-11-21 16:09:22

2021-10-19 14:02:12

服務器SpringSecurity

2017-07-03 09:50:07

Spring Clou微服務架構

2017-08-10 11:15:05

Spring Clou微服務架構

2017-08-09 15:50:47

Spring Clou微服務架構

2022-02-12 21:08:56

微服務SpringIstio

2018-01-25 11:31:29

IBM微服務架構

2018-06-25 08:00:18

Spring Clou架構數據中臺

2022-02-10 15:32:20

Spring微服務電商
點贊
收藏

51CTO技術棧公眾號

久久99精品久久久久久动态图| 欧美电影免费看| 成人精品电影在线观看| 欧美一区在线直播| 综合 欧美 亚洲日本| 国产精品亚洲欧美日韩一区在线| 亚洲成人在线观看视频| 午夜一区二区三视频在线观看| 国产浮力第一页| 久久精品官网| 欧美成人sm免费视频| 在线观看日韩精品视频| 黄页免费欧美| 欧美视频13p| 中文字幕第50页| 日本福利片在线| 精品一区二区在线免费观看| 91精品国产高清久久久久久久久| 男人av资源站| 精品精品久久| 亚洲国产精品999| 亚洲第一天堂久久| 色婷婷综合久久久中字幕精品久久| 亚洲乱码日产精品bd| 久久综合精品一区| 亚洲黄色a级片| 极品少妇一区二区三区精品视频| 国产成人在线播放| 日本午夜视频在线观看| 黄色成人av网站| 久久久91精品国产| 亚洲图片第一页| 思热99re视热频这里只精品| 欧美va亚洲va香蕉在线| 中文字幕亚洲影院| 日韩精品第二页| 欧美性一区二区| 成人一级片网站| 涩涩在线视频| 午夜视频在线观看一区二区| 国产精品国产三级国产专区51| 国产无套粉嫩白浆在线2022年| 99精品偷自拍| 国产一区免费| 天堂在线观看av| av网站一区二区三区| 国产精品久久久久久久久久久久冷 | 男生操女生视频在线观看 | 91成人免费| 色先锋资源久久综合5566| 五月天精品视频| 九九热爱视频精品视频| 亚洲乱码av中文一区二区| 精品黑人一区二区三区观看时间| 日韩aaa久久蜜桃av| 亚洲成人黄色网址| 中文在线永久免费观看| 欧美日韩直播| 亚洲欧洲一区二区三区在线观看| 久久只有这里有精品| 国产精品亚洲片在线播放| 亚洲欧美国产精品久久久久久久| 日韩在线免费观看av| 红桃成人av在线播放| 中文字幕亚洲综合| 久久人妻无码aⅴ毛片a片app| 午夜久久免费观看| 欧美巨乳在线观看| 日韩欧美国产亚洲| 久久午夜影视| 国产在线视频不卡| 午夜美女福利视频| 91在线视频官网| 日本在线观看不卡| 欧美性videos| 亚洲一区二区三区国产| 97视频在线免费播放| 成人国产精品| 精品久久久久久无| 黄色片视频免费观看| 欧洲视频一区| 欧美成人精品一区二区三区| 国产成人一区二区三区影院在线| 三级欧美在线一区| 亚洲精品免费网站| 亚洲av成人无码久久精品老人| 久久精品欧美日韩精品 | 五十路熟女丰满大屁股 | 国产日韩欧美中文| www黄色网址| 久久久久久久综合日本| 一区二区三区我不卡| 肉肉视频在线观看| 日本韩国一区二区三区| 日本少妇一区二区三区| 三级精品视频| 欧美成人午夜视频| youjizz在线视频| 国产乱一区二区| 裸体丰满少妇做受久久99精品| 日韩免费网站| 精品久久久久久| 手机在线视频一区| 精品中文一区| 国精产品一区一区三区有限在线| 一级片在线观看视频| www.欧美.com| 欧美日韩午夜爽爽| 亚洲精品一区| 亚洲电影免费观看高清完整版在线观看| 中文字幕 自拍| 亚洲国产高清一区| 91丨九色丨国产在线| 九色蝌蚪在线| 精品久久久久久久久久久久| 在线a免费观看| 日本一区二区在线看| 91精品国产九九九久久久亚洲| 国产精品系列视频| 国产午夜亚洲精品不卡| 国产av熟女一区二区三区 | 国产精选在线观看91| 91社区在线高清| 一本大道久久a久久精品综合| aaa黄色大片| 亚洲欧美日韩高清在线| 国产精品一久久香蕉国产线看观看| 天堂在线视频免费| 亚洲一区二区不卡免费| av在线网站免费观看| 日韩欧美高清在线播放| 国产精品jizz在线观看麻豆| 日韩欧美电影在线观看| 午夜精品在线视频一区| 99免费观看视频| 一区二区亚洲| 国产精品xxxx| 草美女在线观看| 精品国产一二三| 久久久久噜噜噜亚洲熟女综合| 激情成人综合网| 熟女视频一区二区三区| 亚洲午夜剧场| 久热在线中文字幕色999舞| 91肉色超薄丝袜脚交一区二区| 欧美国产亚洲另类动漫| 不卡av免费在线| 精品久久网站| 国产精品视频专区| 免费黄色网址在线观看| 91精品免费在线观看| 欧美爱爱免费视频| 国产激情一区二区三区| 国产视频在线观看网站| 成人精品动漫一区二区三区| 久久琪琪电影院| 色欲av永久无码精品无码蜜桃 | 中文一区在线播放| 亚洲77777| 久久久久久久久丰满| 91高跟黑色丝袜呻吟在线观看| 69成人在线| 亚洲国产精彩中文乱码av在线播放 | 白嫩情侣偷拍呻吟刺激| 国产一区成人| 午夜精品一区二区三区在线观看 | 国产伦精品一区二区三区照片91| 九色porny视频在线观看| 亚洲欧美日韩在线高清直播| 国产精品无码粉嫩小泬| 日韩美女视频一区二区| 国产情侣久久久久aⅴ免费| 中文亚洲欧美| 亚洲免费精品视频| 日韩精品一区二区三区中文| 97色在线播放视频| av网站在线免费观看| 欧美一区二区三区四区五区 | 国产视频99| 日韩欧美一区二区三区免费观看| 久久九九全国免费精品观看| 天堂网av2014| 欧美老肥妇做.爰bbww| 国产亚洲欧美久久久久| 久久久亚洲精品石原莉奈| 三级性生活视频| 国产婷婷精品| 男人天堂成人网| 综合综合综合综合综合网| 成人亚洲欧美一区二区三区| 五月花成人网| 一区二区三区久久精品| 农村少妇久久久久久久| 欧美中文字幕一区二区三区亚洲| 精品无码久久久久久久久| 久久蜜桃香蕉精品一区二区三区| 亚洲一区二区偷拍| 久久精品九九| 青春草国产视频| 日韩av片子| 久久一区二区三区av| 日韩精品视频在线看| 国产精品美女久久久久av超清| av影视在线看| 久久亚洲精品一区二区| 国产精品一区二区三区四区色| 欧美电影免费观看完整版| 一区二区三区在线免费观看视频| 亚洲444eee在线观看| 永久免费看mv网站入口| 欧美激情一区在线观看| 亚洲一区二区在线免费| 国产麻豆成人传媒免费观看| 一区二区三区免费播放| 亚洲综合激情| www插插插无码视频网站| 亚州av乱码久久精品蜜桃| 日韩精品久久久免费观看| 老牛影视av一区二区在线观看| 91久久精品日日躁夜夜躁国产| 456成人影院在线观看| 2019中文字幕全在线观看| 中文字幕资源网在线观看| 日韩视频在线观看免费| 草草影院在线观看| 亚洲欧美日本另类| 四虎成人免费在线| 337p日本欧洲亚洲大胆精品| www黄色在线观看| 日韩女优av电影| 国产夫妻在线观看| 欧美一级久久久久久久大片| 国产精品视频无码| 欧美日韩国产精品自在自线| 性高潮视频在线观看| 在线免费亚洲电影| 91青青草视频| 在线观看一区二区精品视频| www.久久久久久久| 色婷婷av一区二区三区gif| 二区视频在线观看| 欧美性猛交xxxx偷拍洗澡| 日韩欧美成人一区二区三区| 欧美日韩视频在线| 国产一级一级国产| 91福利视频久久久久| 亚洲永久精品一区| 精品视频在线免费看| 国产精品久久久久久久免费| 制服丝袜日韩国产| 国产丝袜在线视频| 精品美女被调教视频大全网站| 性欧美18一19性猛交| 精品久久久久久久久久久久久久久 | 26uuu成人网| 夜夜爽夜夜爽精品视频| 免费人成视频在线| 亚洲成人av在线电影| 韩国av免费观看| 色94色欧美sute亚洲13| 最近国语视频在线观看免费播放| 欧美喷潮久久久xxxxx| av无码精品一区二区三区宅噜噜| 日韩欧美国产综合在线一区二区三区 | 日本不卡一区二区三区 | 91视视频在线直接观看在线看网页在线看 | 91一区二区三区在线播放| 中文字幕国产专区| 国产精品久久久久aaaa| 妺妺窝人体色www聚色窝仙踪| 精品国产电影一区| 伊人影院中文字幕| 日韩午夜激情av| 亚洲av成人片色在线观看高潮 | 欧美亚洲国产一区二区三区va | 亚洲高清在线观看| 九色蝌蚪在线| 九九热精品视频国产| 亚洲天堂免费电影| 国产精品视频xxxx| 99久久婷婷国产综合精品青牛牛| 欧美激情第六页| 久久久久电影| 欧美aⅴ在线观看| 久久97超碰色| 国产 中文 字幕 日韩 在线| 中文字幕一区二区三区色视频| 成人免费看片98| 欧美日韩国产免费一区二区| 亚洲精品久久久久久动漫器材一区 | 欧美日韩国产精品成人| 人妻精品一区一区三区蜜桃91 | av中文字幕在线观看| 人人精品人人爱| 国产免费成人av| 亚洲伊人影院| 日韩欧美99| 影音先锋久久| 国内国产精品天干天干| 成人精品鲁一区一区二区| 色偷偷男人天堂| 欧美日韩亚洲高清| 国产高清不卡视频| 亚洲人体大胆视频| 成人在线看视频| 国产大片一区二区| 山东少妇露脸刺激对白在线| 亚洲成人自拍一区| 国产一区二区三区中文字幕 | 神马午夜在线观看| xxav国产精品美女主播| 桃色一区二区| 黑人中文字幕一区二区三区| 亚洲国产一区二区在线观看| 国产精品69页| 91一区一区三区| 日韩激情一区二区三区| 91精品国产综合久久久久久久久久| 免费在线性爱视频| 97av在线视频| 北条麻妃一区二区三区在线| 在线视频福利一区| 日本不卡视频一二三区| 亚洲第一成人网站| 午夜成人免费电影| 亚洲国产综合网| 欧美黑人极品猛少妇色xxxxx| 色999韩欧美国产综合俺来也| 午夜精品亚洲一区二区三区嫩草 | 蜜桃视频在线免费| 97久久精品在线| 国产精品chinese在线观看| 国风产精品一区二区| 国产一区二区不卡老阿姨| sm捆绑调教视频| 欧美片在线播放| 黄色动漫在线| 亚洲xxx自由成熟| 欧美在线亚洲| 永久看看免费大片| 亚洲伊人色欲综合网| 国产99对白在线播放| 欧美成人亚洲成人| 亚洲午夜精品| 岛国大片在线播放| av不卡免费在线观看| 日产欧产va高清| 精品亚洲一区二区三区在线播放| 国产中文在线播放| 欧美午夜视频在线| 日本欧美一区二区三区| 特级西西人体高清大胆| 欧美日本国产视频| 99自拍视频在线观看| 国产精品三区四区| 国产精品久久久一区二区| 久久精品老司机| 欧美无砖砖区免费| 久做在线视频免费观看| 亚洲自拍偷拍福利| 在线国产欧美| 久久丫精品忘忧草西安产品| 在线欧美一区二区| 理论片午午伦夜理片在线播放| 91色视频在线导航| 亚洲区第一页| 亚洲成人黄色av| 欧美一区欧美二区| 白浆在线视频| 日韩精品极品视频在线观看免费| 国产在线播放一区二区三区| 精品少妇一二三区| 亚洲色图国产精品| 国产精品美女久久久久人| 成人在线观看你懂的| 欧美极品aⅴ影院| 99热这里精品| 日本欧美爱爱爱| 婷婷综合网站| 欧美一级片黄色| 欧美色综合天天久久综合精品| 在线免费观看a视频| 美女亚洲精品| 国产一区二区电影| 欧美精品一二三四区| 久久亚洲综合国产精品99麻豆精品福利 | 国产精品xxxx| 麻豆极品一区二区三区| www.av视频在线观看| 中文字幕一精品亚洲无线一区| 999国产精品一区| 香港日本韩国三级网站| 亚洲成人你懂的| 欧美尤物美女在线| 美女被啪啪一区二区| 国产精品资源站在线| 免费黄色一级大片| 久久欧美在线电影| 亚洲91久久| 丁香激情五月少妇|