分佈式服務架構(微服務架構)
目前主流實現:Dubbo+zookeeper和SpringBoot+Cloud
利用上述技術都可以將功能服務分散到不同服務器部署,然後實現服務間通信(調用)。
請求-->處理1-->處理2-->響應。意思可以將處理1和處理2做成獨立服務分開部署,然後再進行RPC(Dubbo)或HTTP請求和響應模式(Cloud)交互。
Dubbo和Cloud的區別如下:
- Dubbo和Cloud服務調用機制不同,一個RPC、一個HTTP請求響應
- Dubbo一般和zookeeper結合管理服務,Cloud內置集成Eureka管理服務
- Cloud提供一套服務管理的完整方案、Dubbo需要跟其他技術集成使用。
- Cloud僅用於Rest服務管理、Dubbo是將組件服務化管理
Spring Cloud
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等。
- Spring Cloud Netflix
是對Netflix開發的一套分佈式服務框架的封裝,包括服務的發現和註冊,負載均衡、斷路器、REST客戶端、請求路由等。
- Spring Cloud Config
將配置信息中央化保存, 配置Spring Cloud Bus可以實現動態修改配置文件
- Spring Cloud Bus
分佈式消息隊列,是對Kafka, MQ的封裝
- Spring Cloud Security
對Spring Security的封裝,並能配合Netflix使用
- Spring Cloud Zookeeper
對Zookeeper的封裝,使之能配置其它Spring Cloud的子項目使用
-
Spring Cloud Eureka
Spring Cloud Eureka 是 Spring Cloud Netflix 微服務套件中的一部分,它基於Netflix Eureka 做了二次封裝,主要負責完成微服務架構中的服務治理功能。
基於SpringCloud實現服務註冊、查找、負載功能
搭建SpringCloud服務中心(eureka)
-
創建maven project,引入pom.xml定義
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.7.RELEASE</version> <relativePath/> </parent> <properties> <java.version>1.7</java.version> </properties> <dependencies> <!-- springcloud-eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.3.4.RELEASE</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.SR5</version> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
-
追加application.properties中eureka參數定義
#eureka #spring.application.name=EUREKA-SERVER eureka.client.registerWithEureka=false eureka.client.fetchRegistry=false eureka.client.serviceUrl.defaultZone=http://localhost:7777/eureka
-
追加啓動類,使用@EnableEurekaServer
@EnableEurekaServer//啓動eureka服務器 @SpringBootApplication public class EurekaServerBootApplication { public static void main(String[] args){ SpringApplication.run(EurekaServerBootApplication.class, args); } }
-
啓動程序測試
打開瀏覽器輸入http://localhost:7777
向SpringCloud註冊Service服務(Restful服務)
-
在工程中pom.xml中引入jar包定義
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.SR5</version> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.4.RELEASE</version> </dependency> <!-- 指定導入jackson包版本,避免eureka和boot衝突 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.8.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.8</version> </dependency> </dependencies>
-
在application.properties文件追加eureka定義
spring.application.name=PAPER-SERVICE eureka.client.serviceUrl.defaultZone=http://localhost:7777/eureka
-
在啓動類前追加@EnableDiscoveryClient
@EnableDiscoveryClient @SpringBootApplication @MapperScan(basePackages="cn.xdl.ovls.paper.dao") public class PaperBootApplication { public static void main(String[] args) { SpringApplication.run(PaperBootApplication.class, args); } }
-
啓動程序測試
先啓動Eureka服務中心項目,然後啓動服務項目。
瀏覽器輸入http://localhost:7777就可以查看註冊實例
SpringCloud服務調用(RestTemplate模式)
-
在項目中pom.xml引入定義
<!-- ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> <version>1.3.4.RELEASE</version> </dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.SR5</version> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
-
在application.properties追加eureka參數
eureka.client.serviceUrl.defaultZone=http://localhost:7777/eureka
-
創建RestTemplate對象,追加@LoadBalanced,啓用ribbon負載功能
@Configuration public class RestTemplateConfiguration { @Bean @LoadBalanced//追加ribbon負載功能 public RestTemplate createRestTemplate(){ return new RestTemplate(); } }
-
注入RestTemplate對象,利用服務名調用Restful服務
@Autowired private RestTemplate template; //url規則: http://註冊服務名/請求名 ResponseResult result = template.getForObject( "http://SUBJECT-SERVICE/subject", ResponseResult.class);
-
在啓動類前,追加@EnableDiscoveryClient
@EnableDiscoveryClient//啓用服務註冊和查找 @SpringBootApplication public class ExamWebBootApplication { public static void main(String[] args){ SpringApplication.run(ExamWebBootApplication.class, args); } }
-
啓動測試
SpringCloud服務調用(Feign接口對象模式)
-
在pom.xml中追加ribbon和feign定義
<dependencies> <!-- ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> <version>1.3.4.RELEASE</version> </dependency> <!-- feign調用 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.3.4.RELEASE</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.SR5</version> <type>pom</type> </dependency> </dependencies>
-
在application.properties中配置eureka參數
eureka.client.serviceUrl.defaultZone=http://localhost:7777/eureka
-
定義遠程Feign接口,追加@FeignClient標記
@FeignClient(name="SUBJECT-SERVICE")//指定註冊服務名 public interface SubjectRemote { //方法參考Controller定義編寫 @RequestMapping(value="/subject",method=RequestMethod.GET) public ResponseResult loadSubjects(); }
-
注入Feign接口對象調用遠程服務
@Autowired private SubjectRemote subjectRemote; //利用Feign接口對象方法調用遠程服務 ResponseResult result = subjectRemote.loadSubjects();
-
在主入口類中追加@EnableFeignClients和@EnableDiscoveryClient標記
@EnableFeignClients//啓用Feign接口模式調用服務 @EnableDiscoveryClient//啓用服務註冊和查找 @SpringBootApplication public class ExamWebBootApplication { public static void main(String[] args){ SpringApplication.run(ExamWebBootApplication.class, args); } }
-
啓動程序測試