1.工程搭建部署
方案一:完整工程导入
●
cloud.zip(28 KB),如无法运行尝试换未编译版:
cloud-demo.zip(14 KB)
●下载解压上述工程,ide工具导入
方案二:从零开始搭建
1.工程与module创建
1.1 父工程创建
NEW PROJECT
CLOUD-DEMO
NAME:
~/DESKTOP/CODE/OTHER/CLOUD
LOCATION:
ARTIFACT COORDINATES
GROUPLD:
CN.ITCAST.DEMO
THE NAME OF THE ARTIFACT GROUP,USUALLY A COMPANY DOMAIN
ARTIFACTLD:
CLOUD-DEMO
THE NAME OF THE ARTIFACT WITHIN THE GROUP,USUALLY A PROJECT NAME
1.0-SNAPSHOT
VERSION:
HELP
PREVIOUS
CANCEL
FINISH
1.2 子module创建
●module名称:order-service、user-service
●无效文件夹删除,整体结构如图2
CLOUD [CLO
JAVA CLASS
NEW
.IDEA
I
ADD FRAMEWORK SUPPORT...
MODULE...
SONI
KOTLIN CLASS/FILE
L$PR
X CUT
*M
FILE
盾 COPY
LO.GITI
JGC
SCRATCH FILE
介绍N
SRC
COPY PATH/REFERENCE...
DIRECTORY
POM.XR
MGV
PASTE
EXTERNAL L
HTML FILE
ARTHAS COMMAND
SCRATCHES
KOTLIN SCRIPT
FIND USAGES
LF7
KOTLIN WORKSHEET
FIND IN FILES...
公司F
CLOUD [CLOUD-DEMO]~/DESKTOP/CODE/OTHER/CLOUD
.IDEA
ORDER-SERVICE
USERSERVICE
POM.XML
EXTERNAL LIBRARIES
SCRATCHES AND CONSOLES
1.3 父pom资源引入
CLOUD
POM.XML
三三
M POM.XML(CLOUD-DEMO)
PROJECT
PROJECT
~/DESKTOP/CODE/OTHER/CLOUD
CLOUD[CLOUD-DEMO]
<MODULE>USER-SERVICE</MODULE>
12
.IDEA
13
<MODULE>ORDER-SERVICE</MODULE>
ORDER-SERVICE
LCHELPER
</MODULES>
14
SRC
15
TARGET
16
<PARENT>
M POM.XML
17
<GROUPID>ORG.SPRINGFRAMEWORK.BOOT</GROUPID>
USER-SERVICE
<ARTIFACTID>SPRING-BOOT-STARTER-PARENT</ARTIFACTID>
18
M POM.XML
LLLI EXTERNAL LIBRARIES
<VERSION>2.3.9.RELEASE</VERSION>
SCRATCHES AND CONSOLES
<RELATIVEPATH/>
中
</PARENT>
<PROPERTIES>
<PROJECT.BUILD.SOURCEENCODING>UTF-8</PROJECT.BUILD.SOURCEENCODING>
<PROJECT.REPORTING.OUTPUTENCODING>UTF-8</PROJECT.REPORTING.OUTPUTENCODING>
<JAVA.VERSION>1.8</JAVA.VERSION>
<SPRING-CLOUD.VERSION>HOXTON.SR10</SPRING-CLOUD.VERSION>
<MYSQL.VERSION>5.1.47</MYSQL.VERSION>
<MYBATIS.VERSION>2.1.1</MYBATIS.VERSION>
<LOMBOK.VERSION>1.18.20</LOMBOK.VERSION>
中
</PROPERTIES>
<DEPENDENCYMANAGEMENT>
<DEPENDENCIES>
<!-SPRINGCLOUD
脂肪观明明4444440008GGBGGGGGAG
<DEPENDENCY>
<GROUPID>ORG.SPRINGFRAMEWORK.CLOUD</GROUPID>
<ARTIFACTID>SPRING-CLOUD-DEPENDENCIES</ARTIFACTID>
<VERSION>${SPRING-CLOUD.VERSION]</VERSION>
<TYPE>POM</TYPE>
<SCOPE>IMPORT</SCOPE>
</DEPENDENCY>
<!--MYSGL驱动-->
<DEPENDENCY>
<GROUPID>MYSQL</GROUPID>
<ARTIFACTID>MYSQL-CONNECTOR-JAVA</ARTIFACTID>
<VERSION>${MYSQL.VERSION}</VERSION>
</DEPENDENCY>
<!-MYBATIS->
<DEPENDENCY>
<GROUPID>ORG.MYBATIS.SPRING.BOOT</GROUPID>
<ARTIFACTID>MYBATIS-SPRING-BOOT-STARTER</ARTIFACTID>
<VERSION>${MYBATIS.VERSION}</VERSION>
中中
</DEPENDENCY>
<DEPENDENCY>
<GROUPID>ORG.PROJECTLOMBOK</GROUPID>
<ARTIFACTID>LOMBOK</ARTIFACTID>
<VERSION>${LOMBOK.VERSION}</VERSION>
</DEPENDENCY>
</DEPENDENCIES>
STRUC
</DEPENDENCYMANAGEMENT>
</PROJECT>
中国
粘贴以下资源依赖,粘贴后maven会自动拉取依赖,如未拉取请手动刷新
1.4 子module资源引入
user-service
CLOUD
USER-SERVICE
POM.XML
三三本
PROJECT
POM.XML(CLOUD-DEMO)
POM.XML(USER-SERVICE)
ENCODING"UTF-8"?>
CLOUD[CLOUD-DEMO]`/DESKTOP/CODE/OTHER/CLOUD
<?XML VERSION
<PROJECT AMLNS:"HTTP://MAVEN.APACHE.ORG/POM/4.0.0"
.IDEA
ORDER-SERVICE
XMLNS:XSI:"HTTP://WWW.W3.ORG/2001/XMLSCHEMA-INSTANCE"
XSI:SCHENALOCATION:"HTTP://MAVEN.APACHE.ORG/PON/A.9 HTTP://AAVEN-APACHE-ORG/XSD/XSD/MAVEN-4.9.XSD"
TARGET
<PARENT>
POM.XML
<ARTIFACTID>CLOUD-DEMO</ARTIFACTID>
USER-SERVICE
<GROUPID>CN.ITCAST.DEMO</GROUPID>
<VERSION>1.0-SNAPSHOT</VERSION>
TARGET
</PARENT>
MPOM.XML
<MODELVERSION>4.0.0</MODELVERSION>
POM.XML
LLLI EXTERNAL LIBRARIES
SCRATCHES AND CONSOLES
12
<ARTIFACTID>USER-SERVICE</ARTIFACTID>
BUTH
<DEPENDENCIES>
<DEPENDENCY>
<GROUPID>ORG.SPRINGFRAMEWORK.BOOT</GROUPID>
<ARTIFACTID>SPRING-BOOT-STARTER-WEB</ARTIFACTID>
中中
</DEPENDENCY>
<DEPENDENCY>
<GROUPID>MYSQL</GROUPID>
<ARTIFACTID>MYSQL-CONNECTOR-JAVA</ARTIFACTID>
</DEPENDENCY>
<!--MYBATIS->
<DEPENDENCY>
<GROUPID>ORG.MYBATIS.SPRING.BOOT</GROUPID>
<ARTIFACTID>MYBATIS-SPRING-BOOT-STARTER</ARTIFACTID>
</DEPENDENCY>
白白
<DEPENDENCY>
<GROUPID>ORG.PROJECTLOMBOK</GROUPID>
<ARTIFACTID>LOMBOK</ARTIFACTID>
中中中
</DEPENDENCY>
</DEPENDENCIES>
<BUILD>
<FINALNAME>APP</FINALNAME>
<PLUGINS>
<PLUGIN>
<GROUPID>ORG.SPRINGFRAMEWORK.BOOT</GROUPID>
<ARTIFACTID>SPRING-BOOT-MAVEN-PLUGIN</ARTIFACTID>
</PLUGIN>
中自由
</PLUGINS>
</BUILD>
/PROJECT>
order-service
CLOUD
ORDER-SERVICE
M POM.XML
中云三
MA
PROJECT
M POM.XML(CLOUD-DEMO)
POM.XML(USER-SERVICE)
POM.XML(ORDER-SERVICE)
CLOUD [CLOUD-DEMO]~/DESKTOP/CODE/OTHER/CLOUD
12
<?XML VERSION-"1.0"ENCODINA "UTF8"?>
.IDEA
<PROJECT XMLNE-"HTTP://MAVEN.APACHE.ORG/POM/4.0.0"
ORDER-SERVICE
XMLNS:XSI-"HTTP://WWW.W3.ORG/2001/XMLSCHEMA-INSTANCE"
SRC
XS1:SCHENALOCATION-"HTTP://MAVEN-APACHE-ORG/PAR/4,8.8.0 HTTP://MAVEN-APACHE.ORG/XSD/MAVEN-4.8.XSC
TARGET
<PARENT>
MPOM.XML
<ARTIFACTID>CLOUD-DEMO</ARTIFACTID>
USER-SERVICE
<GROUPID>CN.ITCAST.DEMO</GROUPID>
8
<VERSION>1.0-SNAPSHOT</VERSION>
TARGET
900
</PARENT>
POM.XML
<MODELVERSION>4.0.0</MODELVERSION>
M POM.XML
LI EXTERNAL LIBRARIES
12
SCRATCHES AND CONSOLES
<ARTIFACTID>ORDER-SERVICE</ARTIFACTID>
13
262
<PROPERTIES>
<MAVEN.COMPILER.SOURCE>8</MAVEN.COMPILER.SOURCE>
16
<MAVEN.COMPILER.TARGET>8</MAVEN.COMPILER.TARGET>
</PROPERTIES>
17
明明幼幼MMWWWWEEEDEERMMMWWWWWWWWWWWWEEEELE
<DEPENDENCIES>
<DEPENDENCY>
<GROUPID>ORG.SPRINGFRAMEWORK.BOOT</GROUPID>
<ARTIFACTID>SPRING-BOOT-STARTER-WEB</ARTIFACTID>
中
</DEPENDENCY>
<DEPENDENCY>
<GROUPID>MYSQ1</GROUPID>
<ARTIFACTID>MYSQL-CONNECTOR-JAVA</ARTIFACTID>
</DEPENDENCY>
<!-MYBATIS->
<DEPENDENCY>
<GROUPID>ORG.MYBATIS.SPRING.BOOT</GROUPID>
<ARTIFACTID>MYBATIS-SPRING-BOOT-STARTER</ARTIFACTID>
中中
</DEPENDENCY>
<DEPENDENCY>
<GROUPID>ORG.PROJECTLOMBOK</GROUPID>
<ARTIFACTID>LOMBOK</ARTIFACTID>
</DEPENDENCY>
白白白中中中
</DEPENDENCIES>
<BUILD>
PLUGINS>
<PLUGIN>
<GROUPID>ORG.SPRINGFRAMEWORK.BOOT</GROUPID>
<ARTIFACTID>SPRING-BOOT-MAVEN-PLUGIN</ARTIFACTID>
</PLUGIN>
中自由人
</PLUGINS>
</BUILD>
PRO7ECT>
1.5 业务代码编写
1.user-service
application.yml配置文件
|--mapper
|-- UserMapper
|--pojo
|-- User
|--service
|-- UserService
|--web
|-- UserController
|--UserApplication
2.order-service
application.yml配置文件
|--mapper
|-- OrderMapper
|--pojo
|-- Order
|-- User
|--service
|-- OrderService
|--web
|-- OrderController
|--OrderApplication
2.数据库导入
新建模式
PERFORMANCE_SCHEMA
SYS
数据库名:
CLOUD_USER
字符集:
UTF8
排序规则:
UTF8_BIN
取消
好
●需参见上图新建两个数据库,然后导入DDL语句
●
cloud-order.sql(2 KB)
●
cloud-user.sql(2 KB)
导完如下
LOCALHOST
CLOUD ORDER
TB_ORDER
视图
FX函数
事件
查询
备份
CLOUD_USER
B USER
用视图
FX函数
事件
查询
备份
INFORMATION_SCHEMA
MYSQL
00
PERFORMANCE_SCHEMA
SYS
3.项目启动
3.1 启动并访问user-service
LOCALHOST:8081/USER/1
{"ID":1,"USERNAME":"柳岩","ADDRESS":"湖南省衡阳市"Y
3.2 启动并访问order-service
LOCALHOST:8080/ORDER/101
{"ID":101,"USERID":1,"NAME":"APPLE 苹果 IP
ENE 12 ","PRICE";69900,"NUM":1,"USER":NULL>
IPHONE
观察发现,虽然order-service服务调用成功,但是里面的user对象却是空的。原因我们应该也可以了解到是因为User对象数据数存储在数据库:tb_user,而此工程连接数据库是:tb_order,查询此数据库时无法获取对应的User数据,怎么获取?获取的具体实现我们将在下一章节进一步铺开。
4.服务远程调用
分析现有链路调用关系可以发现:
●http://localhost:8081/user/{id} 可以获取用户信息
●http://localhost:8081/order/{orderId} 可以获取订单信息,但是用户信息为空
想要订单信息中返回用户信息,只要在获取订单链路中追加对用户信息的获取、返回值的组装即可,由此引申出微服务之间的远程服务调用,具体调整可见下图。
客户端
USER-SERVICE
ORDER-SERVICE
客户端
ORDER-SERVICE
获取订单信息
获取订单信息
查询订单数据库数据
查询订单数据库数据
微服务查询用户信息
升级
返回用户信息
组装用户信息
返回带用户的订单信息
时序图说明
上述图形为时序图,一般用来描述系统与系统之间的交互流程,主要是交互API、代码顺序、参数一般忽略,时序图不同于业务流程,更关注业务实现过程中系统前后依赖,数据请求与返回,以下为笔者实际工作场景示例:
诊疗中心
护士端
结算中心
药房
住院...
结算中心
诊疗中心
护士端
药房
住院护士
1:获取待转出患者
1.1:获取医嘱执行计划(处置-出入转-出院/转科/转院)
1.2:医嘱执行计划列表
1.3:获取医嘱相关诊疗记录
1.4:患者诊疗记录
1.5:组织患者信息
1.6:待转出患者列表
2:校验指定出院医嘱
2.1:查询医嘱/费用/药房等信息
2.2:医嘱信息
2.3:查询费用信息
2.4:费用信息
2.5:核对结果
3:医嘱审核通过
3.1:二次校验
3.2:更新审核状态
3.2.1:二次校验
3.2.2:清床
3.2.3:停医嘱
3.2.4:退药
3.2.4.1:响应
3.2.4.1.1:作废请领
3.2.4.1.2:审核通过
3.2.4.1.3:审核通过
4:费用审核通过
4.1:二次费用校验
4.2:更新医嘱状态
4.3:状态更新
4.4:操作成功
服务远程调用实现
注入RestTemplate
此处推荐一个小的优雅工具:https://carbon.now.sh/
PACKAGE CN.ITCAST.ORDER;
IMPORT ORG.MYBATIS.SPRING.ANNOTATION.MAPPERSCAN;
IMPORT ORG.SPRINGFRAMEWORK.BOOT.SPRINGAPPLICATION;
IMPORT ORG.SPRINGFRAMEWORK.BOOT.AUTOCONFIGURE.SPRINGBOOTAPPLICATION;
IMPORT ORG.SPRINGFRAMEWORK.CONTEXT.ANNOTATION.BEAN;
IMPORT ORG.SPRINGFRAMEWORK.WEB.CLIENT.RESTTEMPLATE;
**
启动类
@AUTHOR 何波
@DATE 2022-12-22 14:05
@MAPPERSCAN("CN.ITCAST.ORDER.MAPPER")
@SPRINGBOOTAPPLICATION
PUBLIC CLASS ORDERAPPLICATION
PUBLIC STATIC VOID MAIN(STRING[] ARGS) {
SPRINGAPPLICATION.RUN(ORDERAPPLICATION.CLASS, ARGS);
SYSTEM.OUT.PRINTLN("订单工程启动成功");
@BEAN
PUBLIC RESTTEMPLATE GETRESTTEMPLATE() {
RETURN NEW RESTTEMPLATE();
子
RestTemplate完成远程服务调用
在此笔者除了完成远程服务调用,同时对代码做了结构化、异常校验、函数封装。虽然此处逻辑并不复杂,但是对于主干逻辑简化和代码风格,希望能起到一个引导作用。
重启并访问order-service
C
LOCALHOST:8080/ORDER/101
"USER":{"ID":1,"USERNAME":"柳岩","ADDRESS":"湖南省衡阳市"}
{"ID":101,"USERID":L,"NAME":"APPLE 苹果 IPHONE 12","PRICE":699900,"NUM"
RestTemplate如何实现远程服务调用
RESTTEMPLATE.GETFOROBJECT[URL,USER.CLASS)
用户发起声明式调用
调用自身封装函数
GNULLABLE
其底层本质就是封装
THROWS RESTCLIENTEXCEPTION(
具类,当然此种调用
ASSERT.NOTNULICURL,URI IS REQUIRED";
ASSERT.NOTNULL(METHOD. "HTTPMETHOD IS REQUIRED");
CLIENTHTTPRESPONSE RESPONSE NULL;
OBJECT VART4;
请求封装
对于需要TOKEN校验
CLIENTHTTPREQUEST REQUEST THIS.CREATEREQUESTLURL,METHOD):
的一般会自己封装:
IF(REQUESTCALLBACK IULL)(
CLIENTHTTPREQUESTF
REQUESTCALLBACK.DOWITHREQUEST[REQUEST);
ACTORY.感兴趣的可
发起请求
以进一步搜索.
RESPONSE REQUESTEXECUTE();
THIS.HANDLEFLESPONSE(URTHOD.RESPONSE);
VAR14 - RESPONSEEXTRACTOR LE NULL ? RESPONSEEXTRACTOR.EXTRACTDATAFRESPONSE):NULL;
)CATCH(IOEXCEPTION VAR12)(
STRING RESOURCE URL.TOSTRING();
STRING QUERY URL GETRAWQUERYD;
RESOURCE `QUERY LA NULL ? RESOURCE.SUBSTRING(O,RESOURCE.INDEXOF(63):RESOURCE;
BROW NTY RESOUROURCOOSEXCOPTON'+REGOUROR ON'+ NETNESSAGE+
RETUM VAR14;
5.总结
本节笔者带领大家完成了SpringCloud工程从0->1的搭建,当然你不想搭建也可以直接采用方案一,二者等效,至此读者们完成了一个微服务工程的搭建、部署、访问。同时在本节最后一章,笔者基于RestTemplate发起的http请求实现远程调用,实现当A系统想要获取B系统数据时的跨系统数据交互。然而RESTful API(进一步了解可移步:链接)访问并不是微服务的唯一解决方案,如Dubbo的交互一样可以实现,希望读者们能不限于此。
在本章节,笔者希望大家对于微服务的拆分,服务调用关系有个初步认知,本例中当order-service调用user-service时,前者就充当了服务调用方,后者则是服务提供方,这种调用关系在后续我们将会大量使用。
思考问题
●如何实现服务远程调用?
●服务远程调用解决了什么问题?
●还有哪些技术可以实现远程服务调用?
6.推荐阅读资料
●了解时序图绘制:https://www.cnblogs.com/liuyitan/p/16631240.html