1. 微服务架构演变过程
1.1 传统的架构
所有的业务都写在一个工程里边(ALL IN ONE),开发起来比较简单,部署也比较简单,但是程序的耦合度高,业务与业务之间代码耦合在一起,不利于团队开发!
1.2 分布式架构
就是将原来的单体架构,拆分成多个负责相关业务的服务(降低业务之间的耦合度),每个服务拥有自己的相关资源(数据库、缓存、消息队列),各个服务间通过RPC远程调用进行通信(http、dubbo、grpc)。
1.2.1 SOA面向服务架构
-
-
什么是面向服务架构呢?
面向服务架构即SOA,也就是说我们将公共的代码抽取出来,提供一个程序接口,供其他模块调用,SOA是一种架构思想,在SOA中有两个非常重要的概念,WSDL(Web服务描述语言,Web Service Description Language),它是一种服务描述语言,它的格式是xml,他在SOA架构中起到的是标识一个服务(WSDL描述了调用接口的元数据:ip地址、端口号、接口名称、参数等…),SOAP是SOA架构中的通信协议,它是基于Http网络通信协议以及XML通信格式的一种通信协议。
-
Tip: SOA中提供的接口不能够实现跨语言通信,通常它需要依赖一个ESB企业服务总线实现服务的跨语言调用,它提供数据转换以及可靠的消息服务。
SOA的实现:WebService/ESB
1.2.2.1 实现一个简单的WebService
1.2.2.1.1 创建服务提供者
- 创建一个简单的Maven项目
- 编写一个Service业务实现类
package com.muzili.webservice.service.impl;
import com.muzili.webservice.service.UserService;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/**
* @author: muzili(李敷斌)
* @date: 2020-12-26
* @version:
* @description:
*/
@WebService
public class UserServiceImpl implements UserService {
/**
* 通过userId获取用户名称
*
* @param userId
* @return
*/
@WebMethod
public String getUserName(Long userId) {
return "测试用户名"+userId;
}
public static void main(String[] args) {
Endpoint.publish("http://192.168.1.101:8098/service/UserService",new UserServiceImpl());
System.out.println("服务发布成功!");
}
}
代码解析:
- WebService注解用来标识这是一个WebService服务
- WebMethod用于将具体实现方法暴露出去
- main方法中的代码实现了WebService的接口暴露(也就是提供WSDL信息)
1.2.2.1.2 创建服务消费者
- 创建一个JavaEE工程,选择WebService
2.复制ucenter服务的服务暴露接口地址(http://192.168.1.101:8098/service/UserService?wsdl
),借助IDEA生成WebService调用相关实现代码
3.编写一个测试类,进行接口调用测试
package com.muzili.webservice.test;
import com.muzili.webservice.UserServiceImpl;
import com.muzili.webservice.UserServiceImplServiceLocator;
import javax.xml.rpc.ServiceException;
import java.rmi.RemoteException;
/**
* @author: muzili(李敷斌)
* @date: 2020-12-26
* @version:
* @description:
*/
public class TestMain {
public static void main(String[] args) throws ServiceException, RemoteException {
UserServiceImplServiceLocator userServiceImplServiceLocator = new UserServiceImplServiceLocator();
UserServiceImpl userService = userServiceImplServiceLocator.getUserServiceImplPort();
String userName = userService.getUserName(123L);
System.out.println("resp=>"+userName);
}
}
========程序运行结果
log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.
resp=>测试用户名123
Process finished with exit code 0
1.2.2 微服务架构
1.2.2.1 微服务架构产生的原因
- SOA缺乏相关的服务治理生态。
- SOA是基于WSDL进行接口暴露,而WSDL是基于XML进行接口描述的所以非常占用网络带宽
- SOA基于SOAP进行服务间通信,SOAP(http+xml)这种通信方式不能够实现跨语言通信,往往需要借助ESB的支持
1.2.2.2 微服务的基本概念
微服务架构是从SOA演变过来的,所以它承上启下,取其精华去其糟粕,微服务架构的服务拆分粒度会比SOA更细,并且每个服务都会有相关的基础资源(数据库、缓存),微服务更适合前后端分离开发。并且微服务是基于http+json的通信方式,能够实现跨语言通信。
1.2.2.3 微服务架构与SOA架构有什么不同?
- 微服务架构有着完善的服务治理解决方案
- 微服务使用的通信协议是http+json、dubbo、grpc…,而SOA使用的通信协议是SOAP(http+xml)
- 微服务架构能够实现跨语言通信,而SOA架构无法实现它需要借助ESB企业服务总线的支持
1.2.2.4 微服务存在什么问题?
- 分布式事务一致性问题
- 分布式定时任务问题
- 分布式缓存一致性问题
- 应用配置问题
- 服务可用性问题
- 服务发现问题
解决方案有哪些?
- 分布式事务可以通过SpringCloudAlibaba Seate来解决/RabbitMq、RouteMq基于事务的最终一致性解决方案
- 分布式定时任务:XXL-job、Elastic-job、SpringCloudAlibaba ScheduleX
- 服务配置问题:SpringCloudConfig、Nacos
- 服务可用性问题:SpringCloudAlibaba Sentinel
- 服务发现问题:Eureka、Zookeeper、Consul、Nacos
1.2.2.5 为什么要使用SpringCloud
SpringCloud提供了一系列微服务的解决方案,大大节省了开发时间!