资讯详情

资讯详情

SpringCloud:通过订单服务认识什么是微服务

在初学java时如果我们写一个订单商品服务系统一般会把这两个服务放在同一个项目中共用一个pom文件和同样的配置信息两个实例对应的数据表也会放在同一个数据库中。微服务的由来随着业务规模增长单体项目的弊端逐渐暴露当流量访问过大时我们的服务器会因为流量过大而崩溃造成巨大的损失项目功能实现随着生产越来越多服务器所承载的功能也越来越大服务和服务之间的耦合性变高当我们需要改动一处代码时可能需要改动多处代码对我们程序员来说其实是很不方便的如何解决这个问题为了解决这个问题技术大佬们提出了微服务的概念。微服务的概念“微”就是把一个庞大的项目拆分成一个个微小的项目一个微服务只负责单一业务模块实现服务间解耦提升独立性和可维护性。很明显微服务就是把一个大项目拆分成多个微小且独立的项目部署在不同的服务器上。服务拆分原则误区服务拆分不是越小越好也不是越细越好服务越小微服务架构的优点和缺点就会越来越明显。服务越小微服务的独立性越高同时管理微服务的成本也会增加所以微服务的拆分要根据场景来判断。单一职责原则一个服务应该遵循实现一个功能如果多于一个容易导致类变更问题。服务自洽一个单独的服务项目应该能够独立进行开发构建自主管理打包部署······单项依赖不能存在循环依赖如A-B-A 或者 A-B-C-A以订单系统为例将项目拆分成两个子项目商场服务服务可以拆分成两个服务订单服务产品服务。订单服务通过订单id查询订单信息产品服务通过产品id查询产品信息服务之间通过远程调用通信后面NacosOpenFeign实现订单服务通过产品id获得产品信息服务实现流程图在这里插入图片描述如何通过代码实现微服务准备工作1.创建两个数据库分别存放订单数据表和产品数据表微服务推荐数据库分离这是最佳实践单体项目所有表放同一个库-- 订单服务-- 建库createdatabaseifnotexistscloud_ordercharsetutf8mb4;usecloud_order;-- 订单表DROPTABLEIFEXISTSorder_detail;CREATETABLEorder_detail(idINTNOTNULLAUTO_INCREMENTCOMMENT订单id,user_idBIGINT(20)NOTNULLCOMMENT用户ID,product_idBIGINT(20)NULLCOMMENT产品id,numINT(10)NULLDEFAULT0COMMENT下单数量,priceBIGINT(20)NOTNULLCOMMENT实付款,delete_flagTINYINT(4)NULLDEFAULT0,create_timeDATETIMEDEFAULTnow(),update_timeDATETIMEDEFAULTnow(),PRIMARYKEY(id))ENGINEINNODBDEFAULTCHARACTERSETutf8mb4COMMENT订单表;-- 数据初始化insertintoorder_detail(user_id,product_id,num,price)values(2001,1001,1,99),(2002,1002,1,30),(2001,1003,1,40),(2003,1004,3,58),(2004,1005,7,85),(2005,1006,7,94);-- 产品服务createdatabaseifnotexistscloud_productcharsetutf8mb4;-- 产品表usecloud_product;DROPTABLEIFEXISTSproduct_detail;CREATETABLEproduct_detail(idINTNOTNULLAUTO_INCREMENTCOMMENT产品id,product_namevarchar(128)NULLCOMMENT产品名称,product_priceBIGINT(20)NOTNULLCOMMENT产品价格,stateTINYINT(4)NULLDEFAULT0COMMENT产品状态 0-有效 1-下架,create_timeDATETIMEDEFAULTnow(),update_timeDATETIMEDEFAULTnow(),PRIMARYKEY(id))ENGINEINNODBDEFAULTCHARACTERSETutf8mb4COMMENT产品表;-- 数据初始化insertintoproduct_detail(id,product_name,product_price,state)values(1001,T恤,101,0),(1002,短袖,30,0),(1003,短裤,44,0),(1004,卫衣,58,0),(1005,马甲,98,0),(1006,羽绒服,101,0),(1007,冲锋衣,30,0),(1008,袜子,44,0),(1009,鞋子,58,0),(10010,毛衣,98,0);2.创建java项目作为父项目父项目本身不写业务代码作为Maven聚合工程统一管理所有子模块的依赖版本。3.在父项目中创建子模块微服务在开发阶段可以在父项目下创建多个子模块运行部署阶段各个子模块打包后就是互相独立的服务可以部署在不同服务器。4.在父项目中管理依赖版本号dependencyMangament和dependency的区别dependencyMangament只是声明依赖不实现jar包引入如果子项目需要用到相关依赖需要显示声明就会使用子项目中指定的jar版本同时父工程的打包方式应该是pom不是jar这里需要手动使用packaging来声明。使用dependency标签会将该依赖从jar包中引入到项目中并被子项目继承删除原来的properties标签从开始复制到声明不复制parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.1.6/versionrelativePath/!-- lookup parent from repository --/parentpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetjava.version17/java.versionmybatis.version3.0.3/mybatis.versionmysql.version8.0.33/mysql.versionspring-cloud.version2022.0.3/spring-cloud.version/propertiesdependenciesdependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency/dependenciesdependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion${mybatis.version}/version/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdversion${mysql.version}/version/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter-test/artifactIdversion${mybatis.version}/versionscopetest/scope/dependency/dependencies/dependencyManagementspringcloudmybatismysqlmybatistest和Springboot 的版本要相对应,详细资料参考官网https://spring.io/projects/spring-cloud5.配置子项目依赖子项目中的依赖互不干扰独立添加管理dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactId/dependency!--mybatis--dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build添加lombok依赖dependenciesdependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency/dependencies配置子项目子项目端口号不能一致必须单独配置子项目连接的数据库也不一致需要单独配置6.创建盒数据表对应的实体类类中的属性需和表中的字段一一对应orderInfoDatapublicclassorderInfo{privateIntegerid;privateStringuserId;privateIntegerproductId;privateIntegernum;privateIntegerprice;privateIntegerdeleteFlag;JsonFormat(patternyyyy-MM-dd)privateDatecreateTime;JsonFormat(patternyyyy-MM-dd)privateDateupdateTime;privateproductInfo productInfo;}productInfoDatapublicclassproductInfo{privateIntegerid;privateStringproductName;privateIntegerproductPrice;privateIntegerstate;JsonFormat(patternyyyy-MM-dd)privateDatecreateTime;JsonFormat(patternyyyy-MM-dd)privateDateupdateTime;}业务代码实现如何实现远程调用使用RestTemplateSpring3.0开始支持的一个HTTP请求工具它是一个同步的RESTAPI客户端提供了常见的REST请求方法的模版。强制使用RSTful风格处理HTTP连接和关闭只需要使用者提供资源的地址和参数即可缺点1.接口对外开放比较危险2.url固定写死修改url时较复杂3.多机部署无法处理踩坑总结1.父项目的pom文件必须设置为pom不然父项目无法管理依赖。2.父项目只是作为一个容器统一管理子项目依赖的版本号没有业务代码实现也没有启动类3.远程调用是通过服务端的应用名进行访问所以在远程调用的代码中服务端的名称一定要合服务端设置的application.name相匹配4.在实际不会把两个项目放在同一个父项目中因为实际上一个业务是由一个团队负责这里只是介绍如何创建父子项目
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →