Arquitectura de microservicios de Spring Cloud

Los microservicios (o arquitectura de microservicios) es un enfoque arquitectónico nativo de la nube en el que una sola aplicación se compone de muchosdébilmente acoplado e independienteUna implementación se compone de componentes o servicios más pequeños.
Spring Cloud es una serie框架的有序集合que simplifica el desarrollo de sistemas distribuidos mediante el uso de la comodidad de desarrollo de Spring Boot, como el descubrimiento de servicios, la puerta de enlace de servicios, el enrutamiento de servicios, el seguimiento de enlaces, etc. La relación de pila de tecnología de la Enciclopedia Baidu
es la siguiente:inserte la descripción de la imagen aquí

concepto

El concepto de microservicios en Spring Cloud Chinese Network
se originó a partir de un artículo "Microservicios" escrito por Martin Fowler en marzo de 2014. La arquitectura de microservicios es un patrón arquitectónico. Aboga por dividir una sola aplicación en un conjunto de pequeños servicios. Cada servicio se coordina y coopera entre sí para proporcionar a los usuarios el máximo valor. Cada servicio se ejecuta en su propio proceso independiente, y los servicios se comunican entre sí mediante un mecanismo de comunicación ligero (generalmente API RESTFUL basada en HTTP). Cada servicio se crea en torno a un negocio específico y se puede implementar de forma independiente en un entorno de producción, un entorno similar a la producción, etc. debe ser De acuerdo con el contexto empresarial, elija el lenguaje y las herramientas apropiados para construirlo. 微服务是一种架构风格, una aplicación de software grande y compleja consta de uno o más microservicios. Cada microservicio en el sistema se puede implementar de forma independiente y cada microservicio se acopla libremente (puede llamarse entre sí). Cada microservicio solo se enfoca en hacer una tarea y hacerlo bien, y en todos los casos, cada tarea representa una capacidad de pequeña empresa.
Acoplamiento: el grado de correlación entre dos cosas, según el grado de correlación, el grado de acoplamiento se divide
en:
✔ Acoplamiento completo: estrechamente relacionado, no se puede separar, el siguiente paso se basa en el paso anterior
✔ Acoplamiento flojo: el el grado de correlación no es alto
✔ Acoplamiento de solución completa: sin asociación.
Los microservicios pueden ejecutarse en contenedores. Los contenedores deben proporcionar un entorno para los microservicios. Lo que se ejecuta en los contenedores son los microservicios. Los contenedores no tienen nada que ver con los microservicios.

为什么叫微服务架构?
Siempre que haya una capa de microservicios en toda la arquitectura, se la puede llamar arquitectura de microservicios.

容易混淆的概念
Spring boot: spring boot es un marco, una especificación de programación completamente nueva, y su generación simplifica el uso del marco. La llamada simplificación se refiere a la simplificación de una gran cantidad de archivos de configuración engorrosos requeridos en muchos marcos de primavera, por lo que springboot es un servicio Cuadro por cuadro, el alcance del servicio son archivos de configuración simplificados.

Spring cloud: spring cloud proporciona un conjunto completo de soluciones de servicio basadas en spring boot, incluido el registro y descubrimiento de servicios, el centro de configuración, la supervisión completa de enlaces, la puerta de enlace de servicios, el equilibrio de carga, el fusible y otros componentes. Spring cloud utiliza la comodidad de desarrollo de spring boot ingeniosamente
. Al simplificar el desarrollo de la infraestructura de los sistemas distribuidos, Spring Cloud proporciona a los desarrolladores herramientas para construir rápidamente sistemas distribuidos, incluida la gestión de la configuración, el descubrimiento de servicios, los interruptores automáticos, el enrutamiento, los microagentes y los buses de eventos. Utilice el estilo de desarrollo de Spring Boot para lograr uno -haga clic en inicio e implementación!

La diferencia entre Springboot y Springcloud

Spring boot: Centrarse en el desarrollo rápido y conveniente de microservicios individuales (centrarse en micro, simplificar la configuración);
Spring cloud: centrarse en el marco de gobernanza de coordinación de microservicios global, combinar y administrar microservicios individuales desarrollados por spring boot (centrarse en macro);
Spring boot se puede usar de forma independiente sin Spring Cloud, pero Spring Cloud no se puede separar de Spring Boot, que es una dependencia.

Análisis de todos los componentes de Spring cloud

inserte la descripción de la imagen aquí

1.Fegin(接口调用): Los microservicios se comunican a través de la interfaz de descanso. Springcloud proporciona el marco fegin para admitir llamadas de descanso. fegin permite que las llamadas de interfaz de descanso de diferentes procesos se lleven a cabo de una manera elegante. Esta elegancia se comporta como la misma llamada de proceso (proceso de comunicación de microservicio simplificado )

2.Eureka(注册发现): En el modo de microservicio, una aplicación web grande generalmente se divide en muchas aplicaciones web más pequeñas (servicios). En este momento, debe haber un lugar para almacenar la información relevante de estos servicios, para que cada aplicación pequeña pueda conocerse entre sí. , esta vez necesitas registrarte en el centro de registro. Cuando se inicia cada aplicación, registra su propia información (dirección IP, número de puerto, nombre del servicio, etc.) con el centro de registro configurado, y el centro de registro los guarda. Cuando los servicios se llaman entre sí, se pueden encontrar en el registro centro a través del nombre del servicio. La información del servicio correspondiente, para comunicarse, anotación y servicios de descubrimiento brindan comodidad a las llamadas entre microservicios y resuelven el problema de la codificación rígida. Los servicios solo pasan la identificación del servicio de cada uno sin conocer su IP y puerto. Sí, para obtener el servicio de la otra parte
Codificado: el código está codificado, y la persona que llama solo se puede encontrar escribiendo quien lo llama

3.Ribbon(负载均衡): Ribbon es un equilibrador de carga lanzado por Netflix. Ayuda a controlar el comportamiento de los clientes HTTP y TCP. Después de configurar la lista de direcciones del proveedor de servicios para la cinta, la cinta puede ayudar automáticamente al consumidor del servicio a ir en función de una determinada carga. algoritmo de equilibrio. Ribbon nos proporciona muchos algoritmos de equilibrio de carga de forma predeterminada, como sondeo, aleatorio, etc. la lista de direcciones de los proveedores de servicios de eurekaserver y solicite una instancia de uno de los proveedores de servicios según el algoritmo de equilibrio de carga (para la confiabilidad del servicio, un microservicio puede implementar varias instancias)

4.Hystrix(熔断器): cuando el proveedor de servicios responde muy lentamente, la solicitud del consumidor al proveedor se verá obligada a esperar hasta que se agote el tiempo de respuesta del proveedor. En un escenario de alta carga, si no se hace nada, estos problemas pueden provocar el agotamiento de los recursos de los proveedores de servicios e incluso el colapso de todo el sistema (efecto avalancha). Hystrix está diseñado para evitar que sucedan tales problemas. Hystirx es una biblioteca tolerante a fallas y retrasos de código abierto de Netflix, que se utiliza para aislar el acceso a sistemas remotos, servicios o bibliotecas de terceros, evitar fallas en cascada y mejorar la disponibilidad del sistema y la tolerancia a fallas.

5.Zuul(微服务网关): los diferentes microservicios generalmente tienen diferentes direcciones de red, y es posible que los clientes externos necesiten llamar a múltiples interfaces de servicio para completar un requisito comercial, como una aplicación móvil para comprar boletos de cine. Es posible llamar a las interfaces de múltiples microservicios para completar el proceso comercial de compra de un boleto.Si el cliente se comunica directamente con cada microservicio, habrá los siguientes problemas: 01. El cliente solicitará
diferentes microservicios varias veces, lo que aumenta la número de clientes 02. Hay solicitudes entre dominios y el procesamiento es relativamente
complicado en ciertos escenarios
03. La autenticación es compleja y cada servicio requiere una autenticación independiente 04.
Algunos microservicios pueden usar protocolos que no son amigables con los firewalls y los navegadores. Habrá ciertas dificultades
Los problemas anteriores se pueden resolver con la ayuda de puertas de enlace de microservicio.

La puerta de enlace de microservicios es una capa intermedia entre el cliente y el servidor, y todas las solicitudes externas pasarán primero a través de la puerta de enlace de microservicios. Después de la puerta de enlace de microservicios, la puerta de enlace de microservicios encapsulará la estructura interna de la aplicación. El cliente solo necesita interactuar con la puerta de enlace sin llamar directamente a la interfaz de un microservicio específico. De esta manera, se puede simplificar el desarrollo. No solo eso, utilizando microservicios La puerta de enlace también tiene las siguientes ventajas:
1) Supervisión sencilla: los datos de supervisión se pueden recopilar en la puerta de enlace de microservicios y enviarlos a sistemas externos para su análisis
2) Autenticación sencilla: la autenticación se puede realizar en la puerta de enlace de microservicios y luego se reenvía la solicitud al backend Microservicios sin autenticación en cada microservicio
3) Reduce el número de interacciones entre clientes y microservicios individuales

Spring cloud bus (servicio de configuración unificado)

Spring Cloud Bus utiliza un intermediario de mensajes ligero para vincular nodos en un sistema distribuido. Este proxy se puede usar para transmitir cambios de estado (como cambios de configuración) u otras instrucciones administrativas. Una idea clave es que este bus es como un actuador distribuido para aplicaciones Spring Boot que pueden escalar horizontalmente. Pero también se puede utilizar como canal de comunicación entre aplicaciones. Este proyecto proporciona iniciadores para los corredores de AMQP o Kafka como transportador.
Para las aplicaciones monolíticas tradicionales, los archivos de configuración a menudo se usan para administrar todas las configuraciones. Por ejemplo, una sola aplicación desarrollada por springboot puede colocar el contenido de configuración en el archivo application.Yml Si necesita cambiar el entorno, puede configurar varios perfiles y especificarlos al iniciar la aplicación spring.profiles.active={profile}. Sin embargo, en la arquitectura de microservicios, la gestión de configuración de microservicios generalmente tiene los siguientes requisitos:
01. Configuración de gestión centralizada: un sistema de aplicación que utiliza la arquitectura de microservicios puede contener cientos o miles de microservicios, por lo que la configuración de gestión centralizada es muy útil Necesario
02. Diferente entornos, diferentes configuraciones: por ejemplo, las configuraciones de fuentes de datos son diferentes en diferentes entornos (desarrollo, prueba, prelanzamiento, producción, etc.).
03. Se puede ajustar dinámicamente durante la operación: por ejemplo, el tamaño del grupo de conexiones de la fuente de datos o el umbral del fusible se puede ajustar dinámicamente según la carga de cada microservicio, y el microservicio no se detendrá cuando se ajuste la configuración. 04. Después de que se modifica la configuración, se puede actualizar automáticamente: como el
contenido de la configuración Se producen cambios, y los microservicios pueden actualizar automáticamente la configuración.
En resumen, para la arquitectura de microservicio, un mecanismo general de administración de la configuración es esencial. La práctica común es para usar el servidor de configuración para administrar la configuración, y Spring Cloudbus usa GIT o SVN para la administración. Configure y use buses de información como Kafka o Rabbit MQ para notificar a todas las aplicaciones, a fin de realizar la actualización automática de la configuración y actualizar la configuración de todos los microservicios. instancias.

configuración de implementación

Entorno experimental
El primero 192.168.235.10
y el segundo 192.168.235.11

firewall-cmd --zone=public --add-port=8000/tcp --permanent
firewall-cmd --zone=public --add-port=8761/tcp --permanent
firewall-cmd --zone=public -- add-port=8888/tcp --permanent
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --zone=public --add-port=9001/tcp --permanente
firewall-cmd --recargar

Eureka

[Clúster del Centro de Registro]

  • La primera
[root@localhost ~]# unzip spring-cloud-examples.zip 
[root@localhost ~]# cd spring-cloud-examples/
[root@localhost spring-cloud-examples]# cd eureka-producer-consumer/spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# ls
pom.xml  src
[root@localhost spring-cloud-eureka]# vim src/main/resources/application.properties 
spring.application.name=spring-cloud-eureka
server.port=8000
eureka.client.register-with-eureka=true		#表示是否将自己注册到Eureka Server
eureka.client.fetch-registry=true			#表示是否从Eureka Server中获取注册的服务信息
eureka.client.serviceUrl.defaultZone=http://192.168.235.10:8000/eureka/,http://192.168.235.11:8000/eureka/
[root@localhost spring-cloud-eureka]# mvn clean package			"清除由项目编译创建的target,并打包"
[root@localhost spring-cloud-eureka]# java -jar target/spring-cloud-eureka-0.0.1-SNAPSHOT.jar	   "运行jar包命令"
···会阻塞终端
  • el segundo
[root@localhost ~]# cd spring-cloud-examples/eureka-producer-consumer/spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# vim src/main/resources/application.properties 
spring.application.name=spring-cloud-eureka
server.port=8000
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.serviceUrl.defaultZone=http://192.168.235.10:8000/eureka/,http://192.168.235.11:8000/eureka/
[root@localhost spring-cloud-eureka]# mvn clean package
[root@localhost spring-cloud-eureka]# java -jar target/spring-cloud-eureka-0.0.1-SNAPSHOT.jar

Abra otra terminal en la primera
[root@localhost ~]# firefox 192.168.235.10:8000
inserte la descripción de la imagen aquí

Productor

【Iniciar productor】

  • primero y segundo

Abre otra terminal

[root@localhost ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-producer/
[root@localhost spring-cloud-producer]# vim  src/main/resources/application.properties
spring.application.name=spring-cloud-producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://192.168.235.10:8000/eureka/,http://192.168..235.11:8000/eureka/
[root@localhost spring-cloud-producer]# mvn spring-boot:run
···
  • Modificar la información de salida en la segunda estación

Componentes de equilibrio de carga:
[root@localhost spring-cloud-producer]# vim src/main/java/com/neo/controller/HelloController.java

@RestController
public class HelloController {
    
    

    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
    
    
        return "hello "+name+",this is zhaohuaizhe";
    }
}

[root@localhost spring-cloud-producer]# mvn spring-boot:ejecutar

  • El primer consumidor en ejecutar
[root@localhost ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-consumer/
[root@localhost spring-cloud-consumer]# vim src/main/resources/application.properties 
spring.application.name=spring-cloud-consumer
server.port=9001
eureka.client.serviceUrl.defaultZone=http://192.168.235.10:8000/eureka/,http://1
92.168.235.11:8000/eureka/
[root@localhost spring-cloud-consumer]# source /etc/profile
[root@localhost spring-cloud-consumer]# mvn spring-boot:run

Además, la terminal se abre para acceder a la ip del consumidor y la información de retroalimentación del puerto está en el productor

[root@localhost ~]# curl 192.168.235.10:9001/hello/aa
hello aa,this is first messge[root@localhost ~]# curl 192.168.235.10:9001/hello/aa
hello aa,this is zhaohuaizhe

[raíz@localhost ~]# firefox 192.168.235.10:8000
inserte la descripción de la imagen aquí

Hystrix

[El fusible de los microservicios, el papel de los controles de salud]

  • El consumidor (consumidor) en la primera estación termina

Ejecutar consumidor con fusible

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-hystrix/spring-cloud-consumer-hystrix/
[root@localhost spring-cloud-consumer-hystrix]# vim src/main/resources/application.properties
spring.application.name=spring-cloud-consumer-hystrix
server.port=9001
feign.hystrix.enabled=true
eureka.client.serviceUrl.defaultZone=http://192.168.235.10:8000/eureka/,http://192.168.235.11:8000/eureka/
[root@localhost spring-cloud-consumer-hystrix]# mvn spring-boot:run

Abre otra terminal

[root@localhost ~]# curl 192.168.235.10:9001/hello/aa
hello aa,this is first messge
[root@localhost ~]# curl 192.168.235.10:9001/hello/aa
hello aa,this is zhaohuaizhe
第一台上的producer停止
[root@localhost ~]# curl 192.168.235.10:9001/hello/aa
hello aa,this is zhaohuaizhe

[raíz@localhost ~]# firefox 192.168.235.10:8000
inserte la descripción de la imagen aquí

Zuul

  • El consumidor con seguimiento en la primera máquina se detiene

ejecutar puerta de enlace

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-zuul/spring-cloud-zuul/
[root@localhost spring-cloud-zuul]# vim src/main/resources/application.properties 
spring.application.name=gateway-service-zuul
server.port=8888
eureka.client.service-url.defaultZone=http://192.168.235.10:8000/eureka/,http://192.168.235.11:8000/eureka/
#是否开启重试功能
zuul.retryable=true
#对当前服务的重试次数
ribbon.MaxAutoRetries=2
#切换相同Server的次数
ribbon.MaxAutoRetriesNextServer=0
[root@localhost spring-cloud-zuul]# mvn spring-boot:run

Abre otra terminal

[root@localhost ~]# curl 'http://192.168.235.10:8888/spring-cloud-producer/hello?name=haha&token=123'
hello haha,this is zhaohuaizhe

[raíz@localhost ~]# firefox 192.168.235.10:8000
inserte la descripción de la imagen aquí

Sleuth+zipkin (servicio de seguimiento)

Spring Cloud Sleuth implementa una 服务链路跟踪solución distribuida, mediante el uso de Sleuth podemos localizar rápidamente el problema de un determinado servicio.
✔ Sleuth y zipkin se pueden usar en combinación para 图形化的界面ver el retraso de las solicitudes de microservicios y las dependencias de cada microservicio, representar la topología del sistema de microservicios y optimizar un determinado microservicio en función de un análisis que requiere mucho tiempo
. los componentes de Spring Cloud.Implementa una 分布式追踪solución para Spring Cloud, compatible con Zipkin, HTrace y otros sistemas de seguimiento basados ​​en logs, como ELK (Elasticsearch, Logstash, Kibana)
✔ Zipkin es una APM para sistemas distribuidos Tool (Application Performance Management ), implementado en base a Google Dapper. 延迟问题Ayuda a recopilar los datos de tiempo necesarios para resolver la arquitectura de microservicios y administrar estos datos. Combinado con Sleuth, puede proporcionar una interfaz web visualizada para analizar el consumo de tiempo de los enlaces de llamadas.

primer anfitrión

–> Todos los terminales anteriores han terminado, porque hay un directorio fijo dedicado al seguimiento de enlaces
Memory 3G

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/
[root@localhost spring-cloud-sleuth-zipkin]# ls
pom.xml              spring-cloud-producer  zipkin-server
spring-cloud-eureka  spring-cloud-zuul
# 注册中心
[root@localhost spring-cloud-sleuth-zipkin]# cd spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# vim src/main/resources/application.yml 
server:
  port: 8761
spring:
  application:
    name: eureka
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.235.10:8761/eureka/
[root@localhost spring-cloud-eureka]# mvn spring-boot:run

-> El seguimiento de enlaces abre otra terminal [fuente /etc/profile]

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/zipkin-server/
[root@localhost zipkin-server]# vim src/main/resources/application.yml 
      defaultZone: http://192.168.235.10:8761/eureka/
[root@localhost zipkin-server]# mvn spring-boot:run

productor productor[Ctrl+Shift+T]

[root@localhost zipkin-server]# cd ..       
[root@localhost spring-cloud-sleuth-zipkin]# cd spring-cloud-producer/
[root@localhost spring-cloud-producer]# vim src/main/resources/application.yml
server:
  port: 9001
spring:
  application:
    name: producer
  zipkin:
    base-url: http://192.168.235.10:9000
  sleuth:
    sampler:
      percentage: 1.0
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.235.10:8761/eureka/
[root@localhost spring-cloud-producer]# mvn spring-boot:run

–>Puerta Zuul

[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/spring-cloud-zuul/
[root@localhost spring-cloud-zuul]# vim src/main/resources/application.yml 
server:
  port: 8888
spring:
  application:
    name: zuul
  zipkin:
    base-url: http://192.168.235.10:9000
  sleuth:
    sampler:
      percentage: 1.0
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.235.10:8761/eureka/
[root@localhost spring-cloud-zuul]# mvn spring-boot:run

–> abrir otro acceso a la terminal

[root@localhost ~]# curl 'http://192.168.235.10:8888/producer/hello?name=aa&token=123'
hello aa,this is first messge
[root@localhost ~]# firefox 192.168.235.10:9000

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Bota de primavera

Detener el seguimiento del enlace anterior

[root@localhost ~]# cd /root/spring-cloud-examples/spring-boot-admin-eureka/
[root@localhost spring-boot-admin-eureka]# ls
pom.xml                   spring-cloud-producer
spring-boot-admin-server  spring-cloud-producer-2
spring-cloud-eureka

–> Centro de registro

[root@localhost spring-boot-admin-eureka]# cd spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# mvn spring-boot:run

-> Abra otra terminal
y ejecute el productor 1

[root@localhost ~]# cd /root/spring-cloud-examples/spring-boot-admin-eureka/spring-cloud-producer
[root@localhost spring-cloud-producer]# mvn spring-boot:run
Updating port to 9000
2021-09-27 11:40:48.035  INFO 54084 --- [           main] com.neo.ProducerApplication              : Started ProducerApplication in 11.475 seconds (JVM running for 35.568)

ejecutar productor 2

[root@localhost ~]# cd /root/spring-cloud-examples/spring-boot-admin-eureka/spring-cloud-producer-2/
[root@localhost spring-cloud-producer-2]# mvn spring-boot:run
Updating port to 9001
2021-09-27 11:42:16.187  INFO 54263 --- [           main] com.neo.Producer2Application             : Started Producer2Application in 10.92 seconds (JVM running for 18.074)

–> Ejecute el servicio para configurar el correo
[root@localhost ~]# cd /root/spring-cloud-examples/spring-boot-admin-eureka/spring-boot-admin-server/ [root@localhost spring-boot-
admin - servidor]# vim src/main/resources/application.yml

  1 server:
  2   port: 8000
  3 spring:
  4   application:
  5     name: admin-server
  6   mail:
  7     host: smtp.qq.com
  8     username: 1684629789@qq.com
  9     password: xxx(授权密码)
 10     properties:
 11       mail:
 12         smtp:
 13           auth: true
 14           starttls:
 15             enable: true
 16             required: true
 17   boot:
 18     admin:
 19       notify:
 20         mail:
 21           from: 1684629789@qq.com
 22           to: 1684629789@qq.com

[root@localhost spring-boot-admin-server]# mvn spring-boot:run ¡
Detenga a un productor a voluntad para verificar si debe enviar correo!
En lugar de envidia, como sus propios esfuerzos para ponerse al día!

Supongo que te gusta

Origin blog.csdn.net/qq_50573146/article/details/125009770
Recomendado
Clasificación