1.分布式開發簡介
- 分布式開發的思考點:如何可以讓代碼更安全;如何有效的通訊;
在進行分布式處理的時候如何進行程序功能劃分;
- web集群:考慮多用戶并發訪問的處理速度。
業務中心:在進行一些龐大的項目設計過程之中,應該有更加完善的業務處理,這樣所有的客戶端(服務器),用這些業務中心的操作就可以完成具體的功能。
數據庫集群:解決了數據的存儲問題,以及數據的分片管理。
對于分布式的項目開發按照歷史的發展經歷過如下的一些技術:
CORBA:公共對象請求代理架構,它是一種開發的標準,而且也是許多語言都支持的開發標準。
RMI(遠程方法調用):該技術是sun提出的,該技術出現的最大特征是希望可以與CORBA進行市場的競爭,于是這技術出現時,很多公司不認可這些技術。
2、RMI實現方案
用戶->接口(存根)->接口及實現類(骨架)
發現RMI很好用,單不如CORBA廣泛。后基于CORBA設計了RMI-IIOP協議,這個協議應用在了EJB上。
3.EJB思想
用戶->WEB容器->EJB容器(WebSphere、WebLogic、JBoss)
優秀的理論,糟糕的實現。后因XML的出現,基于XML作為交互語言的WebService登場了。
4.Web服務及Soa服務思想
1、.Net 與JAVA通過SOAP協議相互調用(WebService=XML+SOAP).
2、WebService技術開發,存在如下問題:
速度太慢了;
想要采用遠程接口方式調用,就要利用開發工具生成一堆工具類代碼;
3、基于上述SOA思想出現,即將所有的服務統一管理起來,就成了服務總線,那么所有的開發者直接調用里面的服務就完成一些功能。后來又不斷出現了許多的RPC開發技術,其中國內具有代表性的dubbo開發技術,不過成長最快的Rest,因為JSON的廣泛引用,就如同最初XML技術造就了WebService,JSON造就了Rest服務;
利用Rest進行RPC技術實現,這樣的操作速度很快,而且占用的帶寬要少,SpringCloud就將整個Rest作為了RPC實現技術,并且這一技術已經開始出現現有行業的統一之勢。而且Spring Cloud依照Spring Boot開發技術,可以實現項目的打包發布以及單獨運行,這一點符合當前云時代的開發要求。
5.微服務的缺點
SpringCloud整體核心架構只有一點:Rest服務,也就是說在整個SpringCloud配置過程之中,所有的配置處理都是圍繞著Rest完成的,在整個Rest處理之中,一定要有兩個端:服務的提供者(Provider)及服務的消費者(Consumer),所以對于整個SpringCloud基礎結構就是如下所示:
用戶-反向代理-Web微服務-(Restful即服務地址:端口)-微服務提供者
微架構缺點:只有業務層才能規劃為微架構,
REST指的一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。滿足這些約束條件和原則的應用程序或設計就是 RESTful。它主要用于客戶端和服務器交互類的軟件。基于這個風格設計的軟件可以更簡潔,更有層次,更易于實現緩存等機制。
6.Feign-robbon-Eureka-Hystrix熔斷處理機制
客戶端(WEB)-注冊中心-業務層-數據層-MySQL
Web端通過Nginx實現負載均衡,業務端通過在Eureka注冊中心之中進行注冊,通過robbon進行業務端負載均衡配置。通過feign偽造接口實現,將robbon偽造為接口。Hystrix熔斷處理機制,保證某一個微服務即使出現了問題,依然可以正常使用。(原理為某個微服務出現問題,返回定義好的錯誤信息,而不是報錯或無返回)
Feign-robbon-Eureka-Hystrix熔斷處理機制
7.Zuul代理機制:
客戶端-調用微服務X(RPC前端/springBoot)-Rest(zuul代理)-調用微服務X(RPC后端SpringCloud)-數據層-數據庫。
通過Zuul代理的用戶只需要知道指定路由的路徑,就可以訪問指定微服務信息,這樣更好的體現了java中的“key=value”的設計思想,而且所有的微服務Zuul進行代理。
springCloud設計的時候提供有一個SpringCloudConfig程序組件,利用這個組件就可以直接基于GIT或SVN來進行配置文件的管理。
springBoot-zuul代理及Eureka注冊服務-可通過GitHup管理的Config及微服務。
在整體設計上SpringCloud更好的實現了RPC架構,而且使用了Rest作為通訊的基礎,且大量使用的netfix公司的產品技術,這些技術也有了可靠的保證。
8.Restful基礎架構配置項目開發環境
對于rest基礎架構實現處理是Springcloud核心所在。
創建一個microcloud的整體父pom項目,將創建三個子模塊: microcloud-api子模塊,作為公共的信息導入配置模塊; microcloud-provider-dept-8001作為服務提供者,該提供者負責使用Mybatis與數據庫的交互;
Microcloud-consumer-80:作為微服務調用的客戶端使用。
- 創建一個新的maven項目:microcloud;
- 修改pom.xml文件,主要追加spring boot及Spring cloud兩個開發包的依賴關系;
Ps:springCloud離不開springBoot,所以需要配置此依賴包。
- microcloud-api 建立一個api的公共模塊,該模塊的主要功能是提供有公共處理類,本次預計建立一個Dept數據表,里面的字段:
Deptno(long)、dname(String)、dbname(保存的數據庫的名字)
- microcloud-provider-dept-8001
創建一個Rest提供者的項目模塊,在這個模塊主要定義要使用的數據庫腳本;
由于在整個微服務里面需要進行負載均衡操作,所以我們本次在使用的時候加入了數據庫的名稱信息。
9.創建Dept微服務:
所謂微服務的核心本質就是JSON的傳輸,那么既然現在要求使用Mybatis進行數據庫操作,所以應該在項目里面配置Druid的數據庫連接池,而后對外進行項目的發布。
①microcloud-provider-dept-8001:修改pom.xml配置文件,追加相關的依賴程序支持包。
②microcloud-provider-dept-8001:創建IDeptDAO數據操作接口,這個接口里面將提供有三個數據操作方法。
③microcloud-provider-dept-8001:修改Application.yml配置文件,追加mybatis和服務的相關配置信息;
④microcloud-provider-dept-8001:定義src/main/resources/mybatis/mybatis.cfg.xml配置文件:
⑤microcloud-provider-dept-8001:修改src/main/resources/mybatis/mapper/cn/mldn/Dept.xml配置文件;
⑥microcloud-provider-dept-8001:建立IDeptService接口,做業務實現:
⑦microcloud-provider-dept-8001:定義接口的運行主類。
⑧microcloud-provider-dept-8001:進行業務接口測試編寫。
⑨microcloud-provider-dept-8001:建立DeptRest服務類。
@Controller
Public class DeptRest{
@ResquestMapping(value=“dept/get”,method=RequestMethod.GET)
Public Dept get(){
Return xx;
}
}
- 修改hosts配置文件,追加一個映射路徑。
(C:windowsSystem32driversetchosts)
追加“127.0.0.1 dept-8001.com”
- 觀察Rest服務能否正常提供;
調用get操作;dept-8001.com:8001/dept/get/1;
調用list操作;調用add操作。
10.客戶端調用微服務:
- 創建一個Maven的新的模塊:microcloud-consumer-80
- microcloud-consumer-80:修改application.yml配置文件:
Server:
port:80
- microcloud-consumer-80:創建一個Rest的配置程序類,主要進行RestTemplate類對象創建。
@Configuration
Public class RestConfig{
@Bean
Public RestTemplate getRestTemplate(){
Return new RestTemplate();
}
}
- microcloud-consumer-80:創建一個控制器,為了簡化處理,本次不再進行頁面定義,所有服務結果都使用REST返回。
- 編寫啟動程序類
- 修改hosts配置文件,追加訪問控制路徑。
127.0.0.1 client.com
7、進行代碼測試調用
調用數據返回任務:http://client.com/consumer/dept/get?id=1?
11.1Rest提供者安全訪問:
所有Rest服務最終都是暴露在公網,Rest訪問,安全性是首要因素。
11.1配置安全驗證
如果要想進行安全的驗證處理,那么首先一定要先在服務提供方進行處理。
- 【microcloud-provider-dept-8001】修改pom.xml配置文件,追加SpringSecurity相關依賴包引入;
如果你現在配置了安全框架,則在啟動時會出現如下提示信息:
Using default security password:73df5......
- Rest提供者安全訪問配置
security:
Basic:
Enabled:true #啟用springSecurity的安全配置項。
User:
name:mldnjava #認證用戶名
password:hello #認證密碼
role: #授權角色
隨后在項目之中訪問Rest服務接口http://client.com/consumer/dept/get?id=1?,此時在訪問的時候會要求用戶輸入用戶名與密碼,這個時候有一個更簡化方法進行內容的輸入:http://mldnjava:hello@client.com/consumer/dept/get?id=1?
11.2SpringSecurity安全訪問介紹
在安全的開發之中,對于Rest服務提供者不可能被用戶直接訪問的,所以肯定需要一個rest客戶端springboot進行調用,可是現在Rest提供者的服務上有了認證信息,那么該如何訪問呢?
如果這個時候在Rest客戶端上直接使用用戶名和密碼做加密處理,那么根本無法訪問,此時會出現有401的錯誤代碼,因為認證出現了錯誤。是因為所有的認證的處理操作,應該以頭信息的模式進行處理。而后使用base64進行加密處理后才可以得到一個正確的訪問路徑。
- 【microcloud-consumer-80】修改RestConfig配置類,在這個配置類上追加有新的bean配置項;
- 【microcloud-consumer-80】修改ConsumerDeptController配置類,在進行Rest訪問的時候設置好這個頭部的信息。
HttpHeaders headers = new HttpHeaders();
String auth=“user:password”
byte[] encodeAuth =Base64.getEncoder().encode(auth.getbytes(Charset.forName(“US-ASCII”)))
String authHeader = “basic ”+ new String(encodeAuth);
headers.set(“Authorization”,”authHeader”);
在進行授權的頭信息內容配置的時候加密的信息一定要與“Basic ”之間有一個空格。
對于rest而言,在spring課程講過,里面如果進行參數的傳遞,有各自方式,例如:各種頁面的路徑信息組成,如果要是傳遞復雜內容,建議你在整個處理的時候就去使用那些頁面的參數傳遞模式。
11.3 無狀態Session/rest配置
整個Rest項目中的一個問題所在,所有的Rest都是基于Http協議的應用,這種應用上所有的web容器一般都會提供有一個Session機制,也就是說每一個用戶訪問之后,如果該用戶一直連接,則認為該用戶一直被服務器保存狀態,但微服務有可能并發訪問幾W或幾十W人,那么如果所有的Session狀態都被維護著?
- 【microcloud-provider-member-8001】現在修改Rest程序類,追加一個取得session id的方法
request.getSession().getId();
隨后進行提供者的Rest連接訪問,http://mldnjava:hello@dept-9=8001.com:8001/dept/sessionId:
- 在一個springCloud配置之中,默認是會保存有session狀態的,而后如果用戶有需要則可以根據“sessionCreationPolicy”枚舉類進行不同的session狀態設置,但是從整體的操作來說session最好設置為無狀態(服務端不保存你的session狀態)。
application.yml配置文件
Security:
Session:always(保存狀態,服務器內存可能被占滿)
Stateless(無狀態)
不管你以后的項目或者支持類中是否有設置的無狀態的問題,你最好都進行一下設置,否則你的Rest服務將受到嚴重的內存困擾,最嚴重的就是內存溢出。
12.定義安全配置程序類
在進行Rest服務開發的時候,為了保證安全所有的程序里面都需要進行Spring-Security安全認證處理,可是之前所進行的認證處理都是在application.yml配置文件完成的,這樣配置明顯不符合邏輯,如果你需要開發的微服務很多,這些微服務都要求使用統一的用戶名和密碼的時候就非常不方便了。所以現在最簡單的做法是進行統一的設置。
- 創建一個microcloud-security的Maven模塊
- 【microcloud-security】修改pom.xml配置文件
- 【microcloud-security】建立一個統一的安全配置類:
WebSecurityConfig extends WebSecurityConfigurerAdapter{
Public void config(HttpSecurity http)
{
//表示所有訪問都必須進行認證處理后才能正常進行
http.httpBasic().add().authorizeRequest().anyRequest().fullyAuthenticated();
//所有的Rest服務一定要設置為無狀態,以提升操作性能。
http.sessionManager().sessionCreationPolicy(SessionCreation.Policy.STATELESS);
}
}
- 【microcloud-provider-member-8001】修改pom.xml配置文件,引入安全配置模塊
<dependency>
<groupId>cn.mldn<groupId>
<artifactId>microcloud-security<artifactId>
<dependency>
5、【microcloud-provider-member-8001】刪除掉application.yml中與安全有關的配置項。
security:
Basic:
Enabled:true #啟用springSecurity的安全配置項。
User:
name:mldnjava #認證用戶名
password:hello #認證密碼
role: #授權角色
由于現在所寫的安全處理類是在程序啟動類的子包之中,應該可以自動掃描到。
6訪問地址:http://mldnjava@hello@dept-8001.com:8001/dept/sessionId