Spring Cloud-初探微服務

在接觸微服務之前首先梳理下以往項目的架構和一些相關技術點

Spring Cloud-初探微服務

傳統服務架構

傳統項目分為三層架構,將業務邏輯層、數據庫訪問層、控制層放入在一個項目中。

優點:適合於個人或者小團隊開發,不適合大團隊開發。

分佈式項目架構

根據業務需求進行拆分成N個子系統,多個子系統相互協作才能完成業務流程子系統之間通訊,其中使用RPC等遠程通訊技術。

相對於傳統服務架構,分佈式服務架構的優點:

1.拆分模塊,利用接口通信,降低模塊之間的耦合度。

2.將一個項目拆分成若干個子項目,不同的開發人員負責開發不同的子項目。

3.新增功能時只需要增加一個子項目,調用其它系統的接口就可以。

4.可以靈活的進行分佈式部署。

當然有優點就有缺點:

1.系統之間交互需要使用遠程通信,接口開發增加工作量。

2.各個模塊有一些通用的業務邏輯無法共用。 為了解決分佈式架構的缺點,引入了soa架構,SOA:Service Oriented Architecture面向服務的架構。 就是將工程拆分成服務層、表現層兩個工程。服務層中包含業務邏輯,只需要對外提供服務即可。

表現層只需要處理和頁面的交互,業務邏輯都是調用服務層的服務來實現。

項目集群

多臺服務器部署相同應用構成一個集群

作用:通過負載均衡設備共同對外提供服務

RPC遠程調用

RPC 的全稱是 Remote Procedure Call 是一種進程間通信方式。

它允許程序調用另一個地址空間(通常是共享網絡的另一臺機器上)的過程或函數,而不用程序員顯式編碼這個遠程調用的細節。即無論是調用本地接口/服務的還是遠程的接口/服務,本質上編寫的調用代碼基本相同。

比如兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數或者方法,由於不在一個內存空間,不能直接調用,這時候需要通過就可以應用RPC框架的實現來解決

restful

restful是一種架構設計風格,提供了設計原則和約束條件,而不是架構。而滿足這些約束條件和原則的應用程序或設計就是 restful架構或服務。

soap

soap簡單對象訪問協議是一種數據交換協議規範, 是一種輕量的、簡單的、基於XML的協議的規範。SOAP協議和HTTP協議一樣,都是底層的通信協議,只是請求包的格式不同而已,SOAP包是XML格式的。soap基於xml並封裝成了符合http協議,因此,它符合任何路由器、防火牆或代理服務器的要求。soap可以使用任何語言來完成,只要發送正確的soap請求即可,基於soap的服務可以在任何平臺無需修改即可正常使用。

rpc

RPC就是從一臺機器(客戶端)上通過參數傳遞的方式調用另一臺機器(服務器)上的一個函數或方法(可以統稱為服務)並得到返回的結果。 RPC 會隱藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊) RPC是一個請求響應模型。客戶端發起請求,服務器返回響應(類似於Http的工作方式) RPC在使用形式上像調用本地函數(或方法)一樣去調用遠程的函數(或方法)。

rpc遠程調用框架

1.RMI實現

利用java.rmi包實現,基於Java遠程方法協議(Java Remote Method Protocol) 和java的原生序列化。

2.Hessian

是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能。基於HTTP協議,採用二進制編解碼。

3.thrift

是一種可伸縮的跨語言服務的軟件框架。thrift允許你定義一個描述文件,描述數據類型和服務接口。依據該文件,編譯器方便地生成RPC客戶端和服務器通信代碼。

4.SpringCloud

為開發人員提供了快速構建分佈式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分佈式會話等等。

5.Dubbo

是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和Spring框架無縫集成。

面型服務架構SOA

業務系統分解為多個組件,讓每個組件都獨立提供離散,自治,可複用的服務能力 通過服務的組合和編排來實現上層的業務流程

作用:簡化維護,降低整體風險,伸縮靈活

1.微服務架構

Spring Cloud-初探微服務

1.1 什麼是微服務架構 瞭解了以上概念現在來介紹下什麼是微服務架構,微服務架構設計理念是各服務之間相互隔離-分佈式也是隔離,自治-分佈式 依賴整體組合、單一職責、邊界、異步通信、獨立部署等 作用:各服務可獨立應用,組合服務也可系統應用(巨石應用[monolith]的簡化實現策略-平臺思想)1.2 SOA架構與微服務架構區別 SOA架構主要針對企業級、採用ESB服務(ESB企業服務總線),非常重,需要序列化和反序列化,採用XML格式傳輸。 微服務架構主要互聯網公司,輕量級、小巧,獨立運行,基於Http+Rest+JSON格式傳輸。 ESB也可以說是傳統中間件技術與XML、Web服務等技術相互結合的產物。1.3 spring cloud SpringCloud 為開發人員提供了快速構建分佈式系統的一些工具,包括配置管理、服務發現、斷路器、路由、負載均衡、 微代理、事件總線、全局鎖、決策競選、分佈式會話等等。它運行環境簡單,可以在開發人員的電腦上跑。另外說明spring cloud是基於Springboot的,所以需要開發中對Springboot有一定的瞭解。1.4 服務提供者與消費關係 服務提供者:提供服務被人調用 消費者:調用別人服務1.5 spring cloud 解決了什麼問題 配置管理、服務發現(註冊eureka、zookeeper)、服務註冊、斷路器、路由策略、負載均衡、全局鎖、分佈式會話、 客戶端調用、接口網關(ZUUL)、服務管理系統等

2.微服務簡單模擬

2.1 首先構建一個maven項目

pom

 4.0.0 com.ithzk.spring.cloud SpringCloud_Demo pom 1.0-SNAPSHOT   org.springframework.boot spring-boot-starter-parent 1.5.10.RELEASE   consumer-order provider-user  SpringCloud_Demo  http://www.example.com  UTF-8 1.7 1.7  
junit junit 4.11 test ch.qos.logback logback-core 1.2.3 ch.qos.logback logback-classic 1.2.3 org.springframework.boot spring-boot-maven-plugin maven-clean-plugin 3.0.0 maven-resources-plugin 3.0.2
maven-compiler-plugin 3.7.0 maven-surefire-plugin 2.20.1 maven-jar-plugin 3.0.2 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2
2.2 構建服務提供者子項目 provider-user

pom.xml

 org.springframework.boot spring-boot-starter-web 1.4.7.RELEASE 

User.java

package com.ithzk.spring.cloud.entity;/** * @author hzk * @date 2018/5/13 */public class User { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public User(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } public User() { }}

UserController.java

package com.ithzk.spring.cloud.controller;import com.ithzk.spring.cloud.entity.User;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;/** * @author hzk * @date 2018/5/13 */@RestController("/")public class UserController { @GetMapping("/user/{id}") public User getUser(@PathVariable Integer id){ return new User(id,"zs",20); }}

application.yml

server: port: 7900 #程序啟動後的端口,也就是tomcat的端口,可自定義spring: application: name: provider-user

UserApp.java

package com.ithzk.spring.cloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * Hello world! * */@SpringBootApplicationpublic class UserApp { public static void main(String[] args ) { SpringApplication.run(UserApp.class); }}

此時通過7900/user/xx可以訪問接口獲取json格式數據

2.3 構建服務消費者子項目 consumer-order

pom.xml

  org.springframework.boot spring-boot-starter-web 1.4.7.RELEASE 

User.java

package com.ithzk.spring.cloud.entity;/** * @author hzk * @date 2018/5/13 */public class User { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public User(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } public User() { }}

OrderController.java

package com.ithzk.spring.cloud.controller;import com.ithzk.spring.cloud.entity.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;/** * @author hzk * @date 2018/5/13 */@RestControllerpublic class OrderController { //spring 提供用於訪問rest接口的模板對象 @Autowired private RestTemplate restTemplate; @Value("${user.url}") private String url; @GetMapping("/order/{id}") public User getOrder(@PathVariable Integer id){ //訪問提供者 獲取數據 通過rest訪問獲取的json數據轉換為的User對象 User user = restTemplate.getForObject(url + id, User.class); return user; }}

application.yml

server: port: 8900spring: application: name: consumer-orderuser: url: http://localhost:7900/user/

Order.java

package com.ithzk.spring.cloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;/** * Hello world! * */@SpringBootApplicationpublic class OrderApp { //相當於xml中的bean標籤 用於調用當前方法獲取到指定的對象 @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } public static void main( String[] args ) { SpringApplication.run(OrderApp.class); }}

此時通過可以訪問接口8900/order/x,接口轉而請求7900/user/x獲取json格式數據,這就是簡單的微服務樣例,之後博客中會開始進入spring-cloud的應用


分享到:


相關文章: