如何使用IDEA 搭建 SpringCloud 項(xiàng)目
一、前言
所謂微服務(wù),就是要把整個(gè)業(yè)務(wù)模塊拆分成多個(gè)各司其職的小模塊,做到單一職責(zé)原則,不會(huì)重復(fù)開發(fā)相同的業(yè)務(wù)代碼,實(shí)現(xiàn)真正意義上的高內(nèi)聚、低耦合。同時(shí),微服務(wù)可以對外暴露接口,供其它微服務(wù)使用。
如果我們在 A 服務(wù)中發(fā)起一個(gè) http 請求到 B 服務(wù),那么就可以實(shí)現(xiàn)微服務(wù)的遠(yuǎn)程調(diào)用。(restTemplate 的 getForObject 方法可以向?yàn)g覽器發(fā)起請求)
這種方法看起來是可行的,但是把 url 路徑和 Java 代碼耦合到一起,是不符合開閉原則的。于是就出現(xiàn)了 Eureka 注冊中心。
每一個(gè)微服務(wù)在啟動(dòng)的那一刻都需要做一件事情,就是把自己的服務(wù)信息注冊給 Eureka,比如服務(wù)名稱、服務(wù)端口等,其它微服務(wù)想要調(diào)用另一個(gè)服務(wù)的時(shí)候,直接去 Eureka 里面拉取信息就可以了。
同時(shí),為了避免拉取的服務(wù)已經(jīng)掛掉了,我們的服務(wù)每隔 30 秒就會(huì)向 Eureka 發(fā)起一次心跳,來證明自己還活著,如果有一天不跳了,Eureka 就會(huì)把它從注冊列表中剔除。
如果存在多個(gè)服務(wù)提供者,服務(wù)消費(fèi)者就會(huì)利用負(fù)載均衡算法,從服務(wù)列表中挑選一個(gè)!
二、項(xiàng)目搭建
1. 數(shù)據(jù)庫準(zhǔn)備
此處我們要準(zhǔn)備兩個(gè)數(shù)據(jù)庫,user 服務(wù)和 order 服務(wù)各自擁有自己的數(shù)據(jù)庫。
CREATE TABLE USER ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, phone VARCHAR(15) NOT NULL, address VARCHAR(50) NOT NULL ); INSERT INTO USER VALUES (1, "棧老師不回家", 13299075426, "山西省大同市") INSERT INTO USER(NAME, phone, address) VALUES ("肖恩", 18834267011, "山西省太原市") INSERT INTO USER(NAME, phone, address) VALUES ("李華", 12481076533, "山西省運(yùn)城市")
CREATE TABLE orders ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(30) NOT NULL, price INT NOT NULL, user_id INT NOT NULL REFERENCES USER(id) ) INSERT INTO orders VALUES (1, "可樂雞翅", 32, 1); INSERT INTO orders(NAME, price, user_id) VALUES("冰鎮(zhèn)啤酒", 12, 1); INSERT INTO orders(NAME, price, user_id) VALUES("草莓冰激凌", 8, 2); INSERT INTO orders(NAME, price, user_id) VALUES("狼牙土豆", 10, 3);
2. 創(chuàng)建父工程
① 還是 SpringBoot 項(xiàng)目,選擇 Spring Web 依賴
② 刪掉 src 目錄及 mvnw 開頭的兩個(gè)文件
③ 在 pom 文件中添加 packaging 標(biāo)簽和 SpringCloud 版本,并修改 SpringBoot 版本
④ 引入 mysql 和 mybatis 依賴,供后續(xù)使用
⑤ 添加 SpringCloud 依賴庫,后續(xù)子模塊使用的時(shí)候就不需要再指定版本了
3. 創(chuàng)建注冊中心
① 在父級項(xiàng)目上新建模塊
② 選擇 Eureka Server
③ 修改子模塊的 parent 標(biāo)簽內(nèi)容,指向父工程
因?yàn)楦改K中已經(jīng)指定了 SpringCloud 的版本,所以子模塊不需要再重復(fù)寫!
④ 在父級 pom 中添加該子模塊
⑤ 因?yàn)樽宇悤?huì)繼承父類的依賴,所以子類中多余的依賴可以刪掉,后續(xù)需要什么加什么
⑤ 編寫 application.yml 文件
#服務(wù)端口,隨便起 server: port: 11011 #服務(wù)名稱 spring: application: name: eurekaserver datasource: url: jdbc:mysql:///ZXEdb?serverTimezone=UTC username: root password: 856724bb driver-class-name: com.mysql.cj.jdbc.Driver #eureka地址 eureka: client: service-url: defaultZone: http://127.0.0.1:11011/eureka/ register-with-eureka: false fetch-registry: false
服務(wù)名稱和 eureka 地址的配置我們可以認(rèn)為是服務(wù)注冊的配置,而 eureka 自己也是一個(gè)微服務(wù),所以在服務(wù)啟動(dòng)的時(shí)候,它也會(huì)把自己注冊到 eureka 上!
⑥ 啟動(dòng)類上添加 @EnableEurekaServer 注解
⑦ 輸入 http://localhost:11011/,出現(xiàn)以下界面即 Eureka 創(chuàng)建成功。
4. 服務(wù)注冊
情形:
創(chuàng)建一個(gè) order 服務(wù)和一個(gè) user 服務(wù),并把它們都注冊到 eureka 中。order 里面需要用到 user,所以此時(shí)的 order 是消費(fèi)者,user 是提供者。
對于服務(wù)的注冊,我們只需要完成兩步:
① 引入 spring-cloud-starter-netflix-eureka-client 依賴;
② 在 yml 文件中配置服務(wù)名稱和 eureka 地址。
eureka 服務(wù)的依賴是 server,其余微服務(wù)都是 client!
① 創(chuàng)建 order 服務(wù)和 user 服務(wù)
② 引入 eureka 客戶端依賴
③ 在父級 pom 中添加該子模塊
④ 編寫 yml 配置文件
#服務(wù)端口,隨便起 server: port: 8081 #服務(wù)名稱 spring: application: name: userserver datasource: url: jdbc:mysql:///user?serverTimezone=UTC username: root password: 856724bb driver-class-name: com.mysql.cj.jdbc.Driver #eureka地址 eureka: client: service-url: defaultZone: http://127.0.0.1:11011/eureka/
④ 啟動(dòng)類上添加 @EnableEurekaServer 注解
以上是 user 的注冊,order 同理!
5. 編寫業(yè)務(wù)代碼
要求查詢訂單表,其中訂單表里面包含用戶信息。
① 實(shí)體類
② 配置文件中添加駝峰命名功能及實(shí)體映射
#開啟駝峰命名及實(shí)體映射 mybatis: type-aliases-package: com.zxe.orderserver.pojo configuration: map-underscore-to-camel-case: true
③ 編寫數(shù)據(jù)層、業(yè)務(wù)層及控制層的代碼
6. 服務(wù)拉取
服務(wù)拉取是基于服務(wù)名稱獲取服務(wù)列表,然后再對服務(wù)列表做負(fù)載均衡。
① 在 order-service 的啟動(dòng)類中注冊 RestTemplate
@LoadBalanced 注解用來做負(fù)載均衡!
② 編寫 OrderService 代碼,order 要調(diào)用 user,自然要用到 user 接口的訪問路徑,此處的路徑中我們用服務(wù)名來代替 localhost
@Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private RestTemplate restTemplate; public Order findById(Integer id) { Order order = orderMapper.find(id); String url = "http://userserver/user/" + order.getUserId(); User user = restTemplate.getForObject(url, User.class); order.setUser(user); return order; } }
③ 運(yùn)行結(jié)果
到此這篇關(guān)于IDEA 搭建 SpringCloud 項(xiàng)目的文章就介紹到這了,更多相關(guān)IDEA 搭建 SpringCloud 項(xiàng)目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 程序設(shè)計(jì)總復(fù)習(xí)題(java基礎(chǔ)代碼)
這篇文章主要介紹了Java 程序設(shè)計(jì)總復(fù)習(xí)題,主要是java基礎(chǔ)代碼,方便學(xué)習(xí)java的同學(xué)2021-05-05Spring boot搭建web應(yīng)用集成thymeleaf模板實(shí)現(xiàn)登陸
這篇文章主要介紹了Spring boot搭建web應(yīng)用集成thymeleaf模板實(shí)現(xiàn)登陸,頁面使用bootstrap,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12java高級用法之綁定CPU的線程Thread?Affinity簡介
java線程thread affinity是用來將java代碼中的線程綁定到CPU特定的核上,用來提升程序運(yùn)行的性能,這篇文章主要介紹了java高級用法之綁定CPU的線程thread affinity的相關(guān)知識,需要的朋友可以參考下2022-05-05No ‘Access-Control-Allow-Origin‘ header is&nb
這篇文章主要介紹了No ‘Access-Control-Allow-Origin‘ header is present跨域及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02