演变过程
- 传统单体架构——分布式架构——SOA面向服务架构——微服务架构模式
传统架构
- 传统架构: 就是我们在以前所学习到SSM、SSH 、分层架构模式。
Com.mayikt.controller --控制层 控制页面跳转 整合ftl/jsp 渲染页面
Com.mayikt.service —业务逻辑
Com.mayikt.dao—数据访问层。 mybatis、hibernate等。
前端到后端都是一个人开发的
将所有的业务逻辑代码全部都放入在同一个jar包中,没有实现解耦,
如果中间有一个小的模块,引发宕机的情况下,会导致整个系统无法使用。 - 优点:
1.部署简单、开发容易(不需要学习分布式技术 比如 rpc框架 分布式解决方案)
无法实现抗高并发。
应用场景:政府项目、管理系统、ERP、OA、人事管事系统 并发量比较少。 - 缺点:
2.没有实现解耦、不适合于多团队人数开发,容易引发代码提交冲突问题。
分布式架构
-
分布式架构模式基于传统架构演变过来的,会根据不同的业务实现拆分n多个不同子系统。
会员系统–
订单系统
支付系统
秒杀系统
交易系统。
案例:京东官网。
每个子系统中都有自己的团队来实现开发,具有独立数据库、独立缓存、独立mq。
降低我们系统的耦合度,从而可以实现多团队开发。
系统:----- 管理系统+前台用户使用系统 -
京东官网:
www.jd.com
https://jiadian.jd.com/-- 京东家电子系统
https://miaosha.jd.com/ 秒杀子系统
https://auction.jd.com/home.html 拍卖子系统www.jd.com— 顶级域名
子域名
Pay.jd.com —支付系统 解析ip
最终实际根据多个不同域名实现跳转整合成一个大项目。 -
优点:
可以实现解耦、如果某子系统宕机的情况下,不会影响其他的子系统,适合于多团队人数实现开发。 -
缺点:
部署比较复杂的、开发难度比较大、需要有团队沟通成本。
SOA面向服务架构
- SOA面向服务架构模式,面向接口开发 面向业务逻辑层开发。
就是将整个项目中共同的业务逻辑抽取成一个单独的项目,该项目命名是为
服务,提供给其他的服务实现调用,调用的过程中就会涉及到RPC远程调用技术。 - RPC调用技术:feign、httpclient、gpc、基于netty手写dubbo、dubbo
- 优点:
减少我们代码冗余性问题。
服务:只是有接口 没有控制层 没有视图层
这种模式叫作SOA面向业务逻辑的开发
- SOA架构模式特点:
1.SOA架构通讯中,采用XML方式实现传输数据、在高并发下通讯过程中协议存在非常大冗余性,所以在最后微服务架构模式中使用JSON格式替代了XML。
2.SOA架构模式实现方案为Web Service或者是ESB企业服务总线 底层通讯协议SOAP协议(Http+XML)实现传输。
- 传统政府、银行项目还是保留的在使用Web Service
互联网公司肯定采用http+json形式实现运输 - ESB企业服务总线
解决多系统之间跨语言通讯,数据协议的转换,提供可靠消息传输。
基于IDEA快速构建Web Service
- Web Service服务器端、
@WebService
public class UserService {
@WebMethod
public String getUser(Long id) {
return "mayikt用户:" + id
;
}
public static void main(String[] args) {
Endpoint.publish("http://192.168.18.218:8089/service/UserService", new UserService());
System.out.println("服务发布成功");
}
}
http://192.168.18.218:8089/service/UserService?wsdl 获取wsdl
wsdl文件描述接口的调用地址 服务的接口 方法 参数等。
- Web Service客户端
注意:一定要启动服务发布者,在启动客户端生成调用webservice类。
如果idea2020右键没有webservice的话,可以在顶部菜单栏tools->webservice找到
url要填上你的服务端的地址
public class WebServiceClient {
public static void main(String[] args) throws ServiceException, RemoteException {
UserServiceServiceLocator userServiceServiceLocator = new UserServiceServiceLocator();
UserService userService = userServiceServiceLocator.getUserServicePort();
String result = userService.getUser(10L);
System.out.println("result:" + result);
}
}