使用spring cloud搭建微服務框架,是我最近最主要的工做之一,一開始我使用bubbo加zookeeper製做了一個基於dubbo的微服務框架,而後被架構師否了,架構師曰:此物過期。隨即,我上一套spring cloud,與公司大環境框架一致,也廢了很多功夫,如今在這裏分享基礎結構給各位博友,若有不對的地方,歡迎你們直接評論區慫我。嘿嘿。php
後續的代碼已傳至個人github,你們能夠下載查看。html
下載文件地址 前端
首先咱們要了解什麼是微服務,以及微服務的做用,咱們纔可以順利的搭建一個微服務架構。git
博主先用一句話總結什麼是微服務。程序員
微服務就是對某個應用系統的每一個API進行有效的拆分,而後經過某種鏈接方式,用以提供給其餘應用系統調用的API的服務,在調用過程當中實現和解決了一系列問題的綜合就是微服務架構github
顧名思義,微服務得從兩個方面去理解,什麼是"微"、什麼是"服務"。spring
微編程
簡單的講就是體積小,隨處運行,開發簡單。傳統的spring mvc框架配置繁雜,項目依賴雜亂,經常令開發和維護頭疼不已。springboot
服務 服務器
所謂服務,必定要區別於系統,服務一個或者一組相對較小且獨立的功能單元,是用戶能夠感知最小功能集。
微服務最先由Martin Fowler與James Lewis於2014年共同提出,微服務架構風格是一種使用一套小服務來開發單個應用的方式途徑,每一個服務運行在本身的進程中,並使用輕量級機制通訊,一般是HTTP API,這些服務基於業務能力構建,並可以經過自動化部署機制來獨立部署,這些服務使用不一樣的編程語言實現,以及不一樣數據存儲技術,並保持最低限度的集中式管理。
應用的拆分
有程序員A,B,C,他們如今都須要開發一套訂單管理系統。
程序員A採用單系統架構,業務代碼作mvc拆分,前端部分使用php作渲染層。
程序員B採用多應用架構,將產品、訂單、物流、工單、客服等作應用級拆分,而後使用REST API或者tcp直接交互,每一個應用都是一個mvc系統,獨立開發。
程序員C採用微服務,將產品、訂單、物流、工單、客服等作應用級拆分,再使用微服務框架將他們打散拆分紅一個個的服務,例如訂單列表查詢服務、產品列表查詢服務、產品詳情查詢服務等。使用一個個服務組成應用系統而後整合爲訂單管理系統
毫無疑問,程序員A的架構方式只可以在訂單量小,吃了上頓沒下頓的公司應用了。
而程序員B的架構相似大部分電商平臺前期的架構邏輯,這套架構適應能力不錯,可是隨着系統的不斷擴大,維護變的極爲複雜,版本的更替,應用之間的API調用隨着各類各樣的需求複雜多變。
隨着B架構的演變,誕生了程序員C的架構模式,微服務。微服務的理解就是將相似 訂單列表查詢服務、產品列表查詢服務、產品詳情查詢服務進行細分,微分。使咱們的代碼可以經過統一的網關進行整合,可以讓整個公司的系統開發力量完全整合起來,而且微服務中的服務治理、熔斷、負載均衡等等功能增強了對整個系統的治理能力。
目前應對中大型站點的後臺架構,微服務是最適合的一套模式。同時spring boot的出現讓微服務的開發變得更簡單,理解更容易,例如dubbo的開發方式其實比較簡單、易懂,spring cloud更是深度整合spring boot的能力,借用網友的一張對比圖:
圖出處:https://blog.csdn.net/zhouyanqingbfq/article/details/79407285
另外有不少關於微服務的知識理念,博主整理了一些:
https://blog.csdn.net/fly_zhyu/article/details/76408158
https://www.cnblogs.com/wintersun/p/6219259.html
Spring Boot不是一門新技術,因此不用緊張。從本質上來講,Spring Boot就是Spring,它作了那些沒有它你也會去作的Spring Bean配置。它使用「習慣優於配置」(項目中存在大量的配置,此外還內置了一個習慣性的配置,讓你無需手動進行配置)的理念讓你的項目快速運行起來。使用Spring Boot很容易建立一個獨立運行(運行jar,內嵌Servlet容器)、準生產級別的基於Spring框架的項目,使用Spring Boot你能夠不用或者只須要不多的Spring配置。
這一部分博主再也不追述,提供一些資料你們看看就好,能點進這篇博文的人這裏默認你會一些的吧。
Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer's own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.
spring cloud 提供一些工具迅速構建一些經常使用模式的分佈式系統(例如 配置管理,服務發現,斷路器,路由,微代理,控制總線,token,全局鎖,分佈式sessions,cluster state),使用Spring Cloud開發人員能夠快速站出實現這些模式的服務和應用程序。 他們能夠在任何分佈式環境中運行良好,包括開發人員本身的筆記本電腦,裸機數據中心和託管平臺,如Cloud Foundry。
來自spring cloud 官網的第一句介紹,spring cloud提供了一系列的工具去構建一套分佈式系統,這些工具共同組成了一個微服務架構系統,註冊中心、網關、provider、consumer、Rest、分佈式鎖、分佈式session等等功能。
spring cloud的學習資料整理:
http://www.ityouknow.com/springcloud/2016/12/30/springcloud-collect.html
https://blog.csdn.net/forezp/article/details/70148833
eureka註冊中心的搭建 博主使用IDEA搭建
1首先建立一個空的maven項目
填入參數:
finish就ok
finish後刪除目錄下src文件夾
2.而後在cloud中新建module,右鍵根目錄,選擇new》module
新建一個spring boot項目,並添加上eureka依賴
注意content root的地址,在cloudDemo目錄下的erueka
點擊finish,就生成了一個springboot項目,等待maven初始化完畢,此時的項目結構,和eureka的pom文件以下:
啓動eureka註冊中心的方式很簡單,在springboot的啓動類上加上註解
@EnableEurekaServer
而後配置咱們的spring boot啓動:
將resource下面的 application.properties文件改成application.yml文件並添加以下配置:
server: port: 8801 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
而後啓動項目訪問localhost:8801,看到這個界面,Eureka註冊中心就已經啓動成功,接下來咱們能夠編寫一個提供者,一個消費者。
spring cloud的消費者也能夠是提供者,兩者只有邏輯上的區別,它是鏈式的存在。在spring boot中有兩種消費方式:
1.rest+ribbon
2.Feign
接下來咱們編寫消費者
首先保持Eureka的啓動不變,而後在cloudDemo下新建一個module 叫作ribbon,它也是spring boot結構:
注意咱們要添加三個依賴,如上圖紅框依次選擇便可。
同樣,要注意content root的目錄。
建立完成後,編寫springboot的啓動類,首先加上 @ComponentScan 註解,而後添加 @EnableDiscoveryClient 註冊服務,而後注入RestTemplate對象,
@LoadBalanced 表示開啓負載均衡
完整的代碼以下:
@SpringBootApplication @EnableDiscoveryClient //註冊服務 @ComponentScan public class RibbonApplication { public static void main(String[] args) { SpringApplication.run(RibbonApplication.class, args); }
@Bean @Autowired @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } }
而後咱們建立一個測試用的service文件:
代碼以下:
@Service public class HelloService { public String sayHello(){ return "helloWorld"; // 提供一個hello World } }
而後咱們再編寫一個controller,提供一個hello的controller:
完整代碼以下:
@RestController public class HelloController { @Autowired private HelloService helloService; @GetMapping("/hello") public String sayHello(String name){ return helloService.sayHello() + " " + name; } }
而後咱們再配置application.yml , 同樣的 將配置文件改成yml格式,而後輸入配置:
eureka: client: serviceUrl: defaultZone: http://localhost:8801/eureka/ server: port: 8802 spring: application: name: ribbon-provider
以後啓動服務,啓動後訪問 localhost:8802/hello?name=zhangtaifeng :
測試完成,這個服務咱們用他作服務提供者(provider),而後咱們再從新建一個module,能夠叫作 ribbon-consumer,總體配置一致,咱們只須要修改service和controller部分(注意package):
而後修改配置文件爲:
eureka: client: serviceUrl: defaultZone: http://localhost:8801/eureka/ server: port: 8803 spring: application: name: ribbon-consumer
改了端口和應用名稱。
而後複製上面的spring boot入口文件代碼,複製service和controller文件,依然 注意包名和路徑,而後修改HelloService:
咱們啓動應用看看:
RestTemplate成功調用了8802端口上的provider。
到了這裏,相信你們對spring cloud調用服務有了必定的瞭解,cloud經過rest調用服務進行服務間的通訊,每個controller的方法對外提供對應的服務接口。相比較dubbo的rpc調用有一些不同的優點,同時它的開發方式更簡單,配合zuul網關的使用可以達到更好的效果。
feign消費是經過註解的方式進行的消費模式,它默認打開了負載均衡,仍是在cloudDemo下建立一個module,名字叫feign:
注意引用的包。
建立完成,首先編寫入口文件,主要是加上
@EnableDiscoveryClient
@EnableFeignClients
這兩個註解,用於註冊和發現服務。
而後咱們在目錄下新建一個service,controller,或者從前面的工程複製,另外須要新建一個rpc文件夾,而後在rpc下新建一個GetHello接口:
編寫訪問rpc的方法,使用feign調用更加簡便,添加@FeignClient註解便可,value的意思就是目標服務器,能夠直接用yml中配置的application名稱,完整代碼以下:
@FeignClient(value = "ribbon-consumer") public interface GetHello { @RequestMapping(value = "/hello?name=feign",method = RequestMethod.GET) public String sayHello(); }
而後再改造下service代碼:
@Service public class HelloService { @Autowired private GetHello getHello; //注入rpc public String sayHello(){ return getHello.sayHello(); // 提供一個hello World } }
最後仍是修改application.yml文件,配置大體相同,修改應用名和端口,代碼以下:
eureka: client: serviceUrl: defaultZone: http://localhost:8801/eureka/ server: port: 8804 spring: application: name: feign-consumer
而後咱們啓動這個工程看看有什麼效果,注意,這全部的步驟,前面的服務都沒有關閉噢:
啓動後效果如圖。
代碼已傳至個人github,你們能夠下載查看。
從這裏看,spring cloud將咱們的幾個應用串聯起來,各個服務之間互相經過restAPI調用,我以爲Feign要優於ribbon,另外Eureka註冊中心也能夠換成zookeeper或者consul,我目前使用consul。
spring cloud東西很是多,慢慢看,你們一塊兒進步,謝謝。
有什麼問題你們評論區多多交流。