-
Arquitectura monolítica: simple y conveniente, altamente acoplada, poca escalabilidad, adecuada para proyectos pequeños. Ejemplo: Sistema de Gestión de Estudiantes
-
Arquitectura distribuida: débilmente acoplada y escalable, pero compleja y difícil. Adecuado para proyectos de Internet a gran escala, como JD.com y Taobao
-
Microservicios: una buena solución de arquitectura distribuida
①Ventajas: granularidad dividida más pequeña, más servicios independientes y menor acoplamiento
②Desventajas: la estructura es muy compleja y aumenta la dificultad de operación y mantenimiento, monitoreo e implementación
-
SpringCloud es una solución integral para la arquitectura de microservicios, que integra varios componentes funcionales de microservicios excelentes
2.2 Ejemplo de división de servicios
Tomando como ejemplo la demostración en la nube del microservicio en los materiales de la clase previa, su estructura es la siguiente:
cloud-demo: proyecto principal, administrar dependencias
-
order-service: microservicio de pedidos, responsable del negocio relacionado con los pedidos
-
servicio de usuario: microservicio de usuario, responsable del negocio relacionado con el usuario
Requerir:
-
Tanto el microservicio de pedidos como el microservicio de usuarios deben tener sus propias bases de datos, independientes entre sí.
-
Tanto el servicio de pedidos como el servicio de usuario exponen las interfaces Restful al mundo exterior
-
Si el servicio de pedidos necesita consultar la información del usuario, solo puede llamar a la interfaz Restful del servicio del usuario y no puede consultar la base de datos del usuario.
Registrar servidor Eureka
En primer lugar, todos registran el servidor del centro: eureka-server, que debe ser un microservicio independiente
1) Crear un servicio de servidor eureka
En el proyecto principal de demostración en la nube, cree un submódulo:
Complete la información del módulo:
Luego complete la información del servicio:
2) Introducir la dependencia de eureka
Presente la dependencia inicial proporcionada por SpringCloud para eureka:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3) Escribe la clase de inicio
Para escribir una clase de inicio para el servicio del servidor eureka, asegúrese de agregar una anotación @EnableEurekaServer para habilitar la función del centro de registro de eureka:
package cn.itcast.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
4) Escribir archivos de configuración
Escriba un archivo application.yml con el siguiente contenido:
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
5) Iniciar el servicio
Inicie el microservicio y luego visítelo en el navegador: http://127.0.0.1:10086
Ver el siguiente resultado debe ser exitoso:
Ver la lista de servicios en eureka
registro de servicio
A continuación, registramos el servicio de usuario en eureka-server
1) Introducir dependencias
En el archivo pom del servicio de usuario, introduzca las siguientes dependencias del cliente eureka:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2) archivo de configuración
En el servicio de usuario, modifique el archivo application.yml y agregue el nombre del servicio y la dirección eureka:
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
3) Iniciar múltiples instancias de servicio de usuario
Para demostrar un escenario en el que un servicio tiene varias instancias, agregamos una configuración de inicio de SpringBoot e iniciamos un servicio de usuario.
Primero, copie la configuración de inicio del servicio de usuario original:
Luego, en la ventana emergente, complete la información
1. El método de copiar dos servicios de pedido, haga clic con el botón derecho, seleccione Copiar configuración y luego agregue en el lugar seleccionado de la imagen
-Dserver.port=8082 (8082 se refiere al número de puerto)
Ahora, aparecerán dos configuraciones de inicio de servicio de usuario en la ventana de SpringBoot:
Sin embargo, el primero es el puerto 8081 y el segundo es el puerto 8082.
Inicie dos instancias de servicio de usuario:
Ver la página de administración del servidor eureka:
1. Un servicio principal de eureka
2. Servicio de dos órdenes
3. Servicio de un usuario
descubrimiento de servicios
1. Vaya a eureka-server para extraer la lista de instancias de servicios de servicio de usuario e implementar el equilibrio de carga.
Pero no necesitamos hacer estas acciones, solo necesitamos agregar algunas anotaciones.
En OrderApplication de order-service, agregue una anotación @LoadBalanced al Bean RestTemplate:
Vaya a eureka-server para extraer la lista de instancias del servicio de servicio de usuario e implementar el equilibrio de carga.
Pero no necesitamos hacer estas acciones, solo necesitamos agregar algunas anotaciones.
En OrderApplication de order-service, agregue una anotación @LoadBalanced al Bean RestTemplate:
/**
* 创建RestTemplate并注入Spring容器
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
Modifique el método queryOrderById en la clase OrderService en el paquete cn.itcast.order.service en el servicio de servicio de pedidos. Modifique la ruta de la URL para acceder y use el nombre del servicio en lugar de la ip y el puerto:
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.利用RestTemplate发起http请求,查询用户
// 2.1.url路径
String url = "http://userservice/user/" + order.getUserId();
// 2.2.发送http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
// 3.封装user到Order
order.setUser(user);
// 4.返回
return order;
}
Resumir