电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java從單體架構升級到微服務要注意的一些問題

瀏覽:2日期:2022-08-14 08:03:45
前言

由于近年來的移動端的發展和 2C模式 的紅利,一些在風口的企業的業務得到爆發式增長。從架構層面來說,業務驅動技術的變革,所以微服務架構的概念得到很多企業的青睞,因為可以解決服務的大流量和高并發以及穩定性的要求。

但是任何架構設計不是一蹴而就的,不能從起步就開始使用微服務,一般都是先通過單體架構來快速實現需求和搶占市場,然后再迭代式擴展。不能一口氣吃個胖子。

這幾年自己有經歷從單體到微服務的架構演變,也有直接參與到已經落地的微服務架構的項目中。見過好的架構設計,也見過一些孬的設計。好的架構設計,代碼結構優雅,分層清晰,業務邊界劃分明朗,業務開發人員職責清晰。不好的設計就會導致代碼混亂難以維護,對新需求無法快速應變,開發人員容易在補丁上打補丁,最后造成積重難返不得不重構。

架構師需要從業務層面和未來業務發展有個全面的規劃,讓架構高可用,易擴展,靈活易使用,隱藏其復雜性。好的架構會讓下面的業務開發人員按照既定的模式“傻瓜式”編程。

既然第一步是單體架構,那么好的單體架構設計,為我們后期的微服務拆分會有事半功倍的效果。避免重復勞動和過多的重寫。我們可以從這些方面進行一些有效的設計。

劃清業務邊界

如果對未來的架構有微服務的考慮,那么在單體架構的時候就需要理清業務邊界的問題,常見的簡單劃分就是以業務區分,例如:用戶,商品,訂單,支付,權限等等,具體的拆分程度可根據自身業務量和需要做劃分。

當前流行的 DDD(領域驅動設計)可以作為一個指導原則,但是 DDD 比較偏向于理論,需要執行人員有良好的專業能力才能實施的比較好。

代碼層次結構

業務區分好之后,就是項目代碼模塊的設計。在代碼層我們需要根據MVC的模式,建議的代碼設計層次如下:

├─demo-common│ │ demo-common.iml│ │ pom.xml│ │ │ └─src│ ├─main│ │ ├─java│ │ └─resources│ └─test│ └─java├─demo-dao│ │ demo-dao.iml│ │ pom.xml│ │ │ └─src│ ├─main│ │ ├─java│ │ └─resources│ └─test│ └─java├─demo-service│ │ demo-service.iml│ │ pom.xml│ │ │ └─src│ ├─main│ │ ├─java│ │ └─resources│ └─test│ └─java└─demo-web │ demo-web.iml │ pom.xml │ └─src├─main│ ├─java│ └─resources└─test └─java

主要包含4個 module 模塊

demo-common:基礎模塊,枚舉,常亮類,工具類,配置類。 demo-dao:Dao層,mapper接口,mapper.xml。 demo-service:服務接口提供層,業務service接口。 demo-web:web層,Controller類,服務接口,與外部進行交互。

各模塊之間的依賴關系為:

Java從單體架構升級到微服務要注意的一些問題

項目 Module 模塊設計完成之后,每個模塊的內部 package 包如何設計呢?通常有兩種劃分模式:根據業務模塊然后內部按MVC劃分,根據MVC模式然后內部按業務劃分。

1、根據業務模塊劃分,就是將每個業務模塊作為一個 package,然后每個package里面有自己的 MVC,這樣就做到業務模塊的隔離。

Java從單體架構升級到微服務要注意的一些問題

2、根據 MVC 模式劃分,先根據 MVC模式劃分不同的包,service,serviceImpl,dto等,然后再是各個業務自己的模型和服務接口。

Java從單體架構升級到微服務要注意的一些問題

針對上述的兩個劃分模式,個人的選擇是根據業務模式劃分,這樣的包設計與后期微服務拆分有良好的匹配度,拆分的時候只需要將每個業務包下的代碼 Copy 到新的微服務中就行了,易遷移變動小。每個模塊中對不同的業務通過 package 包名進行劃分,例如:com.example.jajian.service.order、com.example.jajian.service.user等。

└─src ├─main │ ├─java │ │ └─com │ │ └─example │ │ └─jajian │ │ ├─common │ │ │ BaserService.java │ │ │ │ │ └─service │ │ ├─order │ │ │ ├─dto │ │ │ │ OrderDto.java │ │ │ │ │ │ │ └─service │ │ │ │ OrderService.java │ │ │ │ │ │ │ └─impl │ │ │ OrderServiceImpl.java │ │ │ │ │ ├─pay │ │ │ ├─dto │ │ │ │ PayDto.java │ │ │ │ │ │ │ └─service │ │ │ │ PayService.java │ │ │ │ │ │ │ └─impl │ │ │ PayServiceImpl.java │ │ │ │ │ └─user │ │ ├─dto │ │ │ UserDto.java │ │ │ │ │ └─service │ │ │ UserService.java │ │ │ │ │ └─impl │ │ UserServiceImpl.java │ │ │ └─resources └─test└─java

這樣劃分有什么好處?我們單體架構的時候這樣開發,當需要拆分成微服務的時候就可以直接將業務包拆分出去,因為每個業務包里面就已經包含了所有的當前業務的關聯業務類。

避免多邊界業務的關聯查詢

單表關聯由于業務需要而且簡單方便易使用,所以多表關聯查詢在單體服務中是普遍存在的,如果我們后期不需要做服務拆分則可以不需要考慮這方面的限制。

但是如果后期有微服務的規劃,那么單體服務的時候如果沒有做這個方面的限制,mybatis 的 mapper.xml中有過多的多表關聯查詢,這些關聯查詢會嚴重影響服務拆分的進度和復雜度。

如果同屬于一個業務領域則可以使用關聯查詢,而那些微服務拆分后屬于不同領域的業務則應避免使用多表關聯查詢,因為不同的業務領域后期會被隔離拆分到不同的服務當中,即數據庫表都是分布在不同的服務器上,所有服務之間都是通過RPC方式進行通信,關聯查詢這時是無法處理的。

Controller層盡量不做業務邏輯處理

??吹胶芏?coder 會在Controller 層做一些業務處理,個人認為這是很不規范的。Controller層是控制層,是和前端進行數據轉換的,這里我們應該只做請求的接受和返回,也無需做一些異常的try...catch...的捕獲,異??梢酝ㄟ^全局通用攔截器統一進行攔截然后返回給前端異常提示語,提升代碼的簡潔性。

所有的參數校驗也放到 service層,因為如果服務內部調用也可以使用提高代碼的共用度。當然分層領域模型最好也能區分開,

DO(Data Object):此對象與數據庫表結構--對應,通過DAO層向上傳輸數據源對象。 DTO(Date Transfer Object):數據傳輸對象,service或Manager向外傳輸的對象。 VO(View Object):顯示層的對象,通常是Web向模板渲染引擎層傳輸的對象。

這樣區分開的好處是,當你需要對展示層數據進行特殊定制化的時候可以靈活變通,例如針對用戶隱私信息身份證號,手機號碼脫敏處理,或者用戶ID加密顯示等。

最后就是統一通用返回類了,通過這種格式的封裝我們將數據格式進行全局格式化,這里的狀態碼可以自己設計的更詳細一點。

public class CommonResult<T> { public static final String CODE_SUCCESS = '0'; public static final String CODE_FAILED = '9999'; private String code; private T data; private String msg; private CommonResult(String code, T data, String msg) {this.code = code;this.data = data;this.msg = msg; } public boolean isSuccess() {return CODE_SUCCESS.equals(code); } public static <T> CommonResult<T> success() {return new CommonResult<>(CODE_SUCCESS, null, null); } public static <T> CommonResult<T> success(T data) {return new CommonResult<>(CODE_SUCCESS, data, null); } public static <T> CommonResult<T> success(T data, String msg) {return new CommonResult<>(CODE_SUCCESS, data, msg); } public static <T> CommonResult<T> failed() {return new CommonResult<>(CODE_FAILED, null, null); } public static <T> CommonResult<T> failed(String errorCode, String msg) {return new CommonResult<>(errorCode, null, msg); } public static <T> CommonResult<T> failed(String msg) {return new CommonResult<>(CODE_FAILED, null, msg); } public static <T> CommonResult<T> failed(T data, String msg) {return new CommonResult<>(CODE_FAILED, data, msg); } public static <T> CommonResult<T> failed(String errorCode, T data, String msg) {return new CommonResult<>(errorCode, data, msg); } // 省略 setter、getter}后記

以上只是列舉了單體服務未來規劃做微服務時需要注意的一部分簡單內容,每個人在做單體架構拆分成微服務的時候都會踩到各種各樣的坑,這些坑成了我們的開發經驗,有了這些坑就會形成注意點,在我們下次開發時就會具有指導意義。也許我們程序員就是在踩坑和填坑的過程中成長壯大起來的。

以上就是Java從單體架構升級到微服務要注意的一些問題的詳細內容,更多關于Java的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 炉门刀边腹板,焦化设备配件,焦化焦炉设备_沧州瑞创机械制造有限公司 | 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | 广州工业氧气-工业氩气-工业氮气-二氧化碳-广州市番禺区得力气体经营部 | 酒糟烘干机-豆渣烘干机-薯渣烘干机-糟渣烘干设备厂家-焦作市真节能环保设备科技有限公司 | 防腐木批发价格_深圳_惠州_东莞防腐木厂家_森源(深圳)防腐木有限公司 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 鑫铭东办公家具一站式定制采购-深圳办公家具厂家直销 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 隧道烘箱_隧道烘箱生产厂家-上海冠顶专业生产烘道设备 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 家庭教育吧-在线家庭教育平台,专注青少年家庭教育 | 影像测量仪_三坐标测量机_一键式二次元_全自动影像测量仪-广东妙机精密科技股份有限公司 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 齿辊分级破碎机,高低压压球机,立式双动力磨粉机-郑州长城冶金设备有限公司 | b2b网站大全,b2b网站排名,找b2b网站就上地球网 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 欧洲MV日韩MV国产_人妻无码一区二区三区免费_少妇被 到高潮喷出白浆av_精品少妇自慰到喷水AV网站 | 冷却塔改造厂家_不锈钢冷却塔_玻璃钢冷却塔改造维修-广东特菱节能空调设备有限公司 | 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 超声波清洗机-超声波清洗设备定制生产厂家 - 深圳市冠博科技实业有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | arch电源_SINPRO_开关电源_模块电源_医疗电源-东佑源 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 铸铝门厂家,别墅大门庭院大门,别墅铸铝门铜门[十大品牌厂家]军强门业 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 郑州墨香品牌设计公司|品牌全案VI设计公司 | 交通信号灯生产厂家_红绿灯厂家_电子警察监控杆_标志杆厂家-沃霖电子科技 | 沈飞防静电地板__机房地板-深圳市沈飞防静电设备有限公司 |