Con el desarrollo de Internet, la escala de las aplicaciones de sitios web continúa expandiéndose, y las arquitecturas de aplicaciones verticales convencionales ya no pueden hacer frente a ella. La arquitectura de servicios distribuidos y la arquitectura de computación móvil son imperativas, y se necesita con urgencia un sistema de gobernanza para garantizar una evolución ordenada de la arquitectura.
Primero, ve a una imagen
Hablando de Dubbo, creo que todos estarán familiarizados con él. Un marco de servicio excelente y de alto rendimiento de código abierto de Alibaba Company puede permitir que las aplicaciones implementen funciones de entrada y salida del servicio a través de RPC de alto rendimiento, y se puede integrar sin problemas con el marco Spring.
Diagrama de arquitectura dubbo
Descripción del rol de nodo:
- Proveedor : El proveedor de servicios que expone el servicio.
- Consumidor : el consumidor del servicio que llama al servicio remoto.
- Registro : el registro para el registro y descubrimiento de servicios
- Monitor : un centro de monitorización que cuenta el número y el tiempo de las llamadas de servicio.
- Contenedor : contenedor de servicio en ejecución
Dos, realización de ideas
Hoy en día, usamos el proceso de un usuario para elegir un producto para realizar un pedido y dividirlo en tres servicios comerciales: centro de usuarios, centro de productos y centro de pedidos ¡ Utilice Springboot + Dubbo para implementar una pequeña demostración!
El proceso de interacción del servicio es el siguiente:
Este artículo presenta principalmente la práctica de desarrollo e integración del marco de Springboot y Dubbo. La división de servicios comerciales reales es un proceso muy complicado, que es mucho más complicado que el que presentamos. Los tres servicios mencionados anteriormente son solo para la demostración del proyecto , ¡No te enredes demasiado por qué quieres dividirte así !
De acuerdo, no digamos demasiadas tonterías, ¡abramos!
- 1. Cree 4 centos7 en la máquina virtual, elija cualquiera para instalar zookeeper
- 2. Cree un proyecto de microservicio y escriba el código
- 3. Implementar microservicios en centos7
- 4. Prueba de llamada de servicio remoto
Tres, instalación del guardián del zoológico
在使用 Dubbo 之前,我们需要一个注册中心,目前 Dubbo 可以选择的注册中心有 zookeeper、Nacos 等,一般建议使用 zookeeper!
Primero, antes de instalar Zookeeper, necesita instalar y configurar JDK.Esta máquina usa Oracle Java8 SE.
- Instale JDK (se puede ignorar si ya está instalado)
yum -y install java-1.8.0-openjdk
- Ver la instalación de java
java -version
- Una vez completada la instalación de JDK, descargue e instale Zookeeper
#创建一个zookeeper文件夹
cd /usr
mkdir zookeeper
#下载zookeeper-3.4.14版本
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
#解压
tar -zxvf zookeeper-3.4.14.tar.gz
Cree directorios de datos y registros
#创建数据和日志存放目录
cd /usr/zookeeper/
mkdir data
mkdir log
#把conf下的zoo_sample.cfg备份一份,然后重命名为zoo.cfg
cd conf/
cp zoo_sample.cfg zoo.cfg
Configurar guardián del zoológico
#编辑zoo.cfg文件
vim zoo.cfg
- Iniciar Zookeeper
#进入Zookeeper的bin目录
cd zookeeper/zookeeper-3.4.14/bin
#启动Zookeeper
./zkServer.sh start
#查询Zookeeper状态
./zkServer.sh status
#关闭Zookeeper状态
./zkServer.sh stop
Aparece el siguiente mensaje, que indica un inicio exitoso.
4. Introducción al proyecto
- versión springboot: 2.1.1.RELEASE
- versión del guardián del zoológico: 3.4.14
- versión dubbo: 2.7.3
- mybtais-plus versión: 3.0.6
- Base de datos: mysql-8
- Herramienta de construcción: maven
- Módulos de servicio: centro de usuarios, centro de productos, centro de pedidos
Cinco, práctica de código
5.1, inicializar la base de datos
Primero, cree 3 bases de datos en el cliente mysql, a saber: dianshang-user
,, dianshang-platform
y dianshang-business
.
- En la base de datos dianshang-user, cree la tabla de usuarios tb_user e inicialice los datos
- En la base de datos de la plataforma dianshang, cree la tabla de productos tb_product e inicialice los datos
- En la base de datos de la plataforma dianshang, cree la tabla de pedidos tb_order y la tabla de detalles de pedidos tb_order_detail
5.2, crea un proyecto
Una vez finalizado el diseño de la tabla de la base de datos, cree un nombre para IDEA en dianshang
el Springboot
proyecto.
El catálogo final es el siguiente:
Descripción de la estructura del directorio:
- dianshang-common: almacena principalmente algunas bibliotecas de herramientas públicas, todos los servicios se pueden utilizar
- dianshang-business: centro de pedidos, donde el
api
módulo proporciona principalmente la interfaz de exposición del servicio dubbo, y elprovider
módulo es unspringboot
proyecto que proporciona operaciones de procesamiento de servicios - dianshang-user: Centro de usuarios, donde los
api
módulos y losprovider
módulos son similares en diseño - dianshang-platform: centro de productos básicos, donde los
api
módulos y losprovider
módulos son similares en diseño
pom
Agregar dubbo
y zookeeper
cliente en el padre de archivos , todos los proyectos dependientes pueden ser utilizados.
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- 因为使用的是 zookeeper 作为注册中心,所以要添加 zookeeper 依赖 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--使用curator 作为zookeeper客户端-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
Recordatorio : cuando configuré el entorno, encontré un hoyo. La zookeeper
versión del proyecto depende de la versión del servidor. Debe ser lo más consistente posible. Por ejemplo, zookeeper
la versión del servidor en este ejemplo lo es 3.4.14
, así que cuando confíe en la zookeeper
biblioteca de archivos, trate de mantenerla también. ¡Consistente, si confías en la 3.5.x
versión zookeeper
, todo tipo de monstruos y fantasmas reportarán errores cuando comience el proyecto!
5.3, crea un proyecto de centro de usuarios
En IDEA, cree dianshang-user
submódulos y confíe en dianshang-common
módulos
<dependencies>
<dependency>
<groupId>org.project.demo</groupId>
<artifactId>dianshang-common</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
Al mismo tiempo, crear dianshang-user-provider
y dianshang-user-api
módulo.
- dianshang-user-api: principalmente proporciona exposición de interfaz a otros servicios
- dianshang-user-provider: similar a un proyecto web, principalmente responsable del negocio básico
crud
y que se basa endianshang-user-api
módulos
5.3.1, configurar el servicio dubbo
Configure el servicio en dianshang-user-provider
el application.yml
archivo de la dubbo
siguiente manera:
#用户中心服务端口
server:
port: 8080
#数据源配置
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: "jdbc:mysql://localhost:3306/dianshang-user"
username: root
password: 111111
#dubbo配置
dubbo:
scan:
# 包名根据自己的实际情况写
base-packages: org.project.dianshang.user
protocol:
port: 20880
name: dubbo
registry:
#zookeeper注册中心地址
address: zookeeper://192.168.0.107:2181
5.3.2, interfaz de exposición de servicio de escritura y clase de implementación
En el dianshang-user-api
módulo, cree una UserApi
interfaz y devuelva el objeto de parámetro UserVo
.
public interface UserApi {
/**
* 查询用户信息
* @param userId
* @return
*/
UserVo findUserById(String userId);
}
Entre ellos UserVo
, se requiere la serialización, de la siguiente manera:
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class UserVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private String userId;
/**
* 用户中文名
*/
private String userName;
}
En el dianshang-user-provider
módulo, escriba la UserApi
clase de implementación de la interfaz de la siguiente manera:
@Service(interfaceClass =UserApi.class)
@Component
public class UserProvider implements UserApi {
@Autowired
private UserService userService;
@Override
public UserVo findUserById(String userId) {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.eq("user_id",userId);
User source = userService.getOne(queryWrapper);
if(source != null){
UserVo vo = new UserVo();
BeanUtils.copyProperties(source,vo);
return vo;
}
return null;
}
}
Continuará. . . .