Cree el servicio Spring Cloud desde cero

1. ¿Qué es SpringCloud?

Sitio web oficial de SpringCloud: https://spring.io/projects/spring-cloud (la sugerencia personal es usar Google Chrome para visitar el sitio web oficial para abrir la traducción al chino y leer el sitio web oficial aproximadamente)

Organice los artículos relacionados con Spring Family Bucket en PDF, preste atención al backend de Java de la cuenta pública de WeChat, responda 666 para descargar este manual de pila de tecnología.

Comprensión personal:

El servidor anterior era como un maestro versátil que podía hablar muchas palabras, brindando servicios a los estudiantes. Si este maestro está enfermo, toda la escuela será suspendida. Ahora que los microservicios se han vuelto populares, la escuela cuenta con un grupo de enseñanza e investigación de matemáticas, un grupo de enseñanza e investigación de chino y un grupo de enseñanza e investigación de lenguas extranjeras. Cada grupo de enseñanza e investigación tiene un grupo de profesores que son específicamente responsables de la enseñanza de una determinada materia. Si falta, la escuela seguirá funcionando.

En este cambio, los programadores que cambian el historial deben clasificar y desacoplar muchos servicios en un servidor, o muchos servicios en varios servidores, y dar sus funciones similares al mismo clúster. Las funciones que se acoplan entre sí se separan, y se colocan en el servidor como microservicios de acuerdo con el negocio y la función, y este servidor solo proporciona un servicio o menos servicios.

Deje que una lógica de servicio grande se desacople en un servicio pequeño, distribuido uniformemente en cada servidor. Los microservicios están aquí. Cada grupo de docencia e investigación es un clúster de microservicios. Ellos brindan el mismo servicio, y el centro de registro Eureka es el lugar donde se almacena la lista de profesores del grupo de docencia e investigación. Los estudiantes quieren visitar el centro de registro para obtener la lista de maestros, y luego visitar a sus profesores de acuerdo con el correspondiente método de carga. No permitirá que un maestro del grupo se agote o que un maestro muera inactivo.

La puerta de enlace Zuul es la guardia de la escuela. Algunos estudiantes vienen a la escuela para buscar a alguien. Es responsable de guiar (enrutar), y a través de algunas configuraciones muy simples, puede bloquear la entrada de algunas personas (verificación de identidad) o controlar personas que quieran aprender matemáticas Solo puede ir al grupo de enseñanza e investigación de matemáticas, no al grupo de enseñanza e investigación de energía nuclear para aprender a construir una bomba atómica (verificación de autoridad).

El fusible Hystrix se puede considerar como un voluntario escolar. Cuando un grupo de enseñanza e investigación golpea colectivamente, los estudiantes no pueden encontrar un maestro. Estos voluntarios informan a los estudiantes visitantes a tiempo, los resultados correspondientes, información anormal, etc., para evitar que haya muchos estudiantes esperando en la escuela. Estos voluntarios clasifican apresuradamente a los estudiantes que esperan. Los estudiantes han estado esperando en la escuela. Otras escuelas que necesitan estudiantes también esperarán a los estudiantes, lo que eventualmente paralizará una gran área del colegio. Aquí tratamos a los estudiantes como solicitudes uno por uno. El fusible es para prevenir la propagación de un accidente incluso si está fundido.

Por supuesto, estos componentes también son microservicios que deben registrarse en el registro de Eureka.

Entonces  Spring Cloud  puede considerarse como esta escuela. Muchos de los componentes mencionados anteriormente son equivalentes a varios departamentos funcionales de la escuela.

PD: El blogger se basa en la idea de Maven +. Además, SpringCloud debe construirse en base a springboot.

2.1 Introducir dependencias relacionadas con Spring Boot Aquí Springboot usa la versión 1.5.7

Introduzca aquí las dependencias relacionadas con Spring Cloud como  Edgware.SR5

2.1 Configuración inicial del proyecto

Cree un proyecto en Idea: Archivo -> Nuevo -> Proyecto

 Haga clic en Proyecto vacío -> Siguiente

 Nombre del proyecto -> Ubicación del proyecto

 Seleccionar módulos -> siguiente

 Después de ingresar a la nueva ventana, comience a configurar Maven, abra la configuración

 Debido a que he realizado la configuración antes, solo necesito cambiar la ruta del cuadro 1. Por ejemplo, la primera configuración necesita encontrar la ubicación de su maven, así como la ubicación de settings.xml , repositorio . Baidu maven integration la idea realmente no es

Haga clic en Aceptar después de seleccionar las 3 casillas

A continuación, cree un nuevo módulo

Puede haber un problema de que la lista de arquetipos no se puede cargar

 Después de usar todas las soluciones en Internet, tomó 3 horas resolverlo y fue inútil. Después de reiniciar, funcionará. ¿Lo crees? ? ? ? ? Cuando era joven, ¡olvidé los dichos más lógicos de los cibercafés y los administradores web! ! ¡Reinícielo! !

Después de salir, seleccione inicio rápido -> siguiente

Después de pensar en el nombre, copie el ArtifactId que desee y haga clic en Siguiente. Si groupId es el nombre de la organización, también piensa en uno, normalmente el sitio web de la empresa está al revés.

 Siguiente paso después de pegar

 La configuración pom.xml del servidor que brinda servicios de registro es la siguiente:

<?xml version="1.0" encoding="UTF-8"?>
 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.yun</groupId>
  <artifactId>springcloud-eureka-server</artifactId>
  <version>1.0-SNAPSHOT</version>
 
  <name>springcloud-eureka-server</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
 
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
 
  <!--引入springboot-parent父项目-->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE</version>
  </parent>
 
  <dependencies>
    <!--引入springcloud的euekea server依赖-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
 
  </dependencies>
 
 
  <!--指定下载源和使用springcloud的版本-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Edgware.SR5</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

 Haga clic en Importar cambios 

Espere a que se cargue la dependencia de springcloud en la esquina inferior derecha

 2.2  La construcción de Springboot y la configuración del servicio para brindar servicios de registro

Crear carpeta de recursos

 Y configúrelo como el directorio raíz de recursos, luego el archivo se vuelve así

Después de eso, la carpeta se convierte en una barra amarilla.

 Cree un nuevo archivo en recursos, el nombre del archivo es application.yml (yml no es xml, cuando el blogger se enteró por primera vez, pensó que eran otros bloggers los que cometieron un error y pisaron un pequeño agujero) 

 Configure yml, nota: si solo configura las dos primeras líneas de información del número de puerto, se informará un error

server:
  port: 8700 # 端口自己决定
  
# 指定当前eureka客户端的注册地址,也就是eureka服务的提供方,当前配置的服务的注册服务方
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
    register-with-eureka: false #自身 不在向eureka注册
    fetch-registry: false #启动时禁用client的注册
  instance:
    hostname: localhost
 
#指定应用名称
spring:
  application:
    name: eureka-server

Suplemento de conocimientos:

 Desarrolle la clase de entrada EurekaServerApplication.java para el arranque de primavera

 EurekaServerApplication.java

package com.yun;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 
@SpringBootApplication
@EnableEurekaServer //当前使用eureka的server
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class,args);
    }
}

Haga clic derecho para ejecutar la clase actual:

Ejecutar correctamente la pantalla de la consola

 Intente ingresar a la interfaz de administración de eureka. El número de puerto está configurado en yml (el número de puerto debe ser mayor que el número de puerto público y reservado) 1024 ~ 65535

Generalmente me gusta configurarlo entre 8700 y 8800

La siguiente interfaz de administración ya puede iniciar sesión

 2.3 La configuración del rol que el cliente brinda el servicio real , brinda el servicio para registrarse con el servidor del registrante del servicio (centro de registro)

También cree un nuevo módulo, seleccione inicio rápido y haga clic en Siguiente

Dos posiciones dejadas en blanco

 Nombra el siguiente paso

 Tenga en cuenta que el módulo debe crearse en el directorio raíz springcloud. La raíz de contenido creará el módulo debajo del módulo anterior por defecto. Esto causará problemas y errores al crear el módulo.

Se recomienda este método de configuración. Cambie el nombre después de springcloud en la raíz del contenido. Haga clic en Siguiente para configurar como se muestra a continuación. El cuadro rojo suele tener el nombre del directorio de archivos del módulo anterior y debe cambiarlo por el nombre de su módulo

 Después del éxito, estará en estado paralelo. Si no está en paralelo o es un error, reconfigura

 Configure el pom de soporte de servicios, que es el mismo que la configuración del pom del servidor, solo necesita cambiar el servidor en el cuadro 1 del primer pom al cliente

Similar al primer microservicio, necesitamos configurar la clase de entrada  pom.xml   application.yml, porque es un proveedor de servicios, aquí necesitamos escribir un controlador de clase de servicio

application.yml

server:
  port: 8701 # 服务提供方
 
# 指定当前eureka客户端的注册地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8700/eureka
  instance:
    hostname: localhost
 
#当前服务名称
spring:
  application:
    name: eureka-service

pom.xml:

Escriba el controlador de servicio proporcionado :

@RestController
@RequestMapping("/Hello")
public class Controller {
    @RequestMapping("/World")
    public String helloWorld(String s){
        System.out.println("传入的值为:"+s);
        return "传入的值为:"+s;
    }
}

Clase de entrada  y ejecute este microservicio:

@SpringBootApplication
@EnableDiscoveryClient//代表自己是一个服务提供方
public class EurekaServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServiceApplication.class,args);
    }
}

 Haga clic con el botón derecho en el nombre de la clase de entrada y haga clic en ejecutar (por supuesto, primero debe abrir el servicio del servidor cuando abra este servicio, que es el primer microservicio que escribimos)

 En este punto, ingrese a la página de registro del servicio http: // localhost: 8700 /

Puede ver que el proveedor de servicios se ha registrado como registrador de  servicios

 Visite directamente la ubicación de red del proveedor de servicios http: // localhost: 8701 / Hello / World? S = 小沛

Hemos visto que es accesible, lo que demuestra que este microservicio está disponible.

 

 Sin embargo, generalmente no llamamos directamente a los microservicios requeridos, sino que obtenemos una lista de proveedores de servicios requeridos (una lista, esta lista contiene servidores que pueden proporcionar los servicios correspondientes) a través del servidor del servidor que proporciona los servicios registrados . Pueden ser un Clúster, por lo que el servidor devolverá una tabla de números de puerto ip +. Los consumidores del servicio acceden a diferentes servidores en esta tabla a través del algoritmo correspondiente. Estos servidores brindan el mismo servicio. Esta forma de elegir los servidores para que se sirvan ellos mismos en el lado del consumidor del servicio Es un cliente- Equilibrio de carga lateral.

En la actualidad, los blogueros saben que hay dos formas de acceder a estos servidores:  sondeo y aleatorio . Sondeo significa bucle. Si hay 3 servidores, el método de acceso es 1, 2, 3, 1, 2, 3, 1, 2, 3 ···· Aleatorio es aleatorio Recuerde el método aleatorio, un método irregular. Ambos métodos tienen la misma posibilidad de acceder a cada servidor. También hay un algoritmo de carga ponderada, lo que significa que el servicio correspondiente se asigna de acuerdo con la capacidad de carga del servidor. Los más capaces hacen mucho. Poca habilidad hace menos.

2.4 Cómo llamar al servicio

El primer método de llamada: restTemplate + ribbon     

 El segundo método de llamada: fingir 

 2.4.1 restTemplate + cinta   

Ribbon es un cliente de equilibrio de carga. ¿Qué es? Lea https://www.jianshu.com/p/1bd66db5dc46

Puedes ver el siguiente párrafo:

La mayor diferencia entre el equilibrio de carga del lado del cliente y el equilibrio de carga del lado del servidor es la ubicación en la lista de servicios mencionado anteriormente se almacena . En el balanceo de carga del cliente, todos los nodos del cliente mantienen una lista de servidores a los que desean acceder, y estas listas de servidores provienen del registro de servicios , como el servidor Eureka que presentamos en el capítulo anterior.

De manera similar a la arquitectura del equilibrio de carga del lado del servidor, en el equilibrio de carga del lado del cliente, también se requiere un latido para mantener el estado de la lista del lado del servidor . De forma predeterminada, se crea la configuración de integración automática de Ribbon para cada marco de gobierno de servicio, como como org.springframework.cloud en Eureka. .netflix.ribbon.eureka.RibbonEurekaAutoConfiguration, org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration en Consul. En el uso real, podemos ayudarnos a usarlo mejor al observar la implementación de estas dos clases para encontrar sus detalles de configuración.

A continuación, crearemos un cliente basado en cinta, que se utiliza para servicios al consumidor.

De la misma manera, primero construya el entorno springboot

La diferencia con la compilación de soporte de servicios anterior es:

El primer paso: ahora es necesario agregar la dependencia de la cinta en las dependencias en pom

<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

 

Paso 2: yml se configura de la siguiente manera:

server:
  port: 8702 # 服务消费方
 
# 指定当前eureka客户端的注册地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8700/eureka
  instance:
    hostname: localhost
 
#当前服务名称
spring:
  application:
    name: eureka-consumer

 El consumidor del servicio aún necesita registrarse en el puerto 8700 del registrante. Configure el puerto 8072 del consumidor de servicios actual , denominado eureka-consumer

El tercer paso: aún es necesario iniciar la clase, porque es una arquitectura springboot:

@SpringBootApplication
@EnableDiscoveryClient //当前使用eureka的server
public class EurekaConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class,args);
    }
}

 Como se muestra arriba:

Necesitamos una clase de controlador para escribir código de cinta.

@RestController
@RequestMapping("/Hello")
class ConsumerController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/Consumer")
    public String helloWorld(String s){
        System.out.println("传入的值为:"+s);
        //第一种调用方式
        //String forObject = new RestTemplate().getForObject("http://localhost:8071/Hello/World?s=" + s, String.class);
 
        //第二种调用方式
        //根据服务名 获取服务列表 根据算法选取某个服务 并访问某个服务的网络位置。
        //ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");
        //String forObject = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/Hello/World?s="+s,String.class);
 
        //第三种调用方式 需要restTemplate注入的方式
        String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
        return forObject;
    }
}

A menudo usamos el tercer método de llamada.

La primera es llamar directamente: soporte de servicios al que se accede directamente sin pasar por la lista de servicios del centro de registro.

El segundo tipo: seleccione la llamada en función del nombre del servicio, como se muestra en la figura anterior, se requiere la siguiente inyección   

    @Autowired
    privado LoadBalancerClient loadBalancerClient;

Como se muestra en el código del segundo método de llamada en el código anterior.

Use el nombre del servicio para ir al registro y obtener la lista de servicios, y la capa inferior actual del cliente hará una selección de algoritmo aleatorio para obtener el servicio y acceder a él.

El tercer tipo requiere que una anotación @Bean se inyecte automáticamente y llame directamente al objeto restTemplate para llamar al servicio. El modo de llamada inferior es el mismo que el modo de segunda llamada. como sigue:

@Configuration
public class Beans {
    //管理简单对象
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

La anotación @Bean le dice a la fábrica que este método debe inyectarse automáticamente.

@LoadBalanced significa que se requiere equilibrio de carga.

Luego inyecte restTemplate como el controlador y úselo, la diferencia es que puede usar directamente el nombre del servicio para acceder

String forObject = 

restTemplate.getForObject ("http: // EUREKA-SERVICE / Hello / World? s =" + s, String.class);

 empezar a probar:

1. Ejecute la clase de inicio del servidor:

 2. Ejecute la clase de inicio de soporte de servicios:

 3. Ejecute la clase de inicio de serviceconsume:

 Acceso al navegador:

 8072 es el puerto del consumidor de servicios

 Análisis del método de acceso:

  • Acceda a la ruta especificada por el consumidor de servicios @RequestMapping y el puerto del consumidor para acceder al controlador del consumidor

  • El controlador obtiene la lista de servicios del servidor de acuerdo con el nombre del servicio. Después de obtener la lista de servicios, la carga se equilibra de acuerdo con el patrón aleatorio y luego selecciona la dirección de servicio para acceder al soporte de servicios: como se muestra a continuación

 

2.5 Configuración de alta disponibilidad del servidor Eureka

Haga clic en la figura siguiente para configurar

A continuación, configure tres parámetros de máquina virtual de 01, 02, 03

01: 8699

 02: 8698

 03: 8697 

 Luego haga clic en Aceptar para guardar, puede ver tres elementos de inicio más

 A continuación, cambie el número de puerto registrado por separado, defaultZone inicia tres elementos de inicio respectivamente

Abra la configuración yml del servidor y elimine las dos primeras líneas de la configuración del número de puerto (hay un error en la figura, elimine las dos líneas de instancia y nombre de host)

 Haga clic en iniciar después de configurar yml 

 De la misma manera, después de cambiar el número de puerto a 8699 y 8697 nuevamente, cambiamos el elemento de inicio a 02 y luego comenzamos (hay un error en la figura, elimine las dos líneas de instancia y nombre de host)

 De manera similar, después de cambiar el puerto yml a 8699 y 8698, cambie el elemento de inicio a 03 y luego comience (hay un error en la figura, elimine las líneas de instancia y nombre de host) 

 Después de comenzar, visite los tres puertos 01, 02 y 03 respectivamente, y podrá verlos y visitarlos.

 Abra la configuración de yml del proveedor de servicios de la siguiente manera y cambie el número de puerto a uno de los tres.

 Después de iniciar el proveedor de servicios, visite los tres 01, 02 y 03 nuevamente y encontraremos

Importante: incluso si el proveedor de servicios solo registra un número de puerto 8699, pero los otros dos números de puerto aún pueden detectar la existencia del proveedor de servicios 8701. Como se muestra abajo:

 A continuación, agregue el número de puerto del registrante del servicio al consumidor del servicio, de modo que cuando cualquier servidor cuelgue, otros servidores también puedan obtener la lista de servicios

 Visite el siguiente consumidor de servicios y descubra que puede llamar a la lista de servicios del servidor a través del consumidor y acceder al servicio

 Simplemente apagamos dos copias del servidor, reiniciamos serviceconsume y luego visitamos. Debe reiniciar serviceconsume para borrar el caché y borrar la lista de servicios en el consumo.

 La figura anterior muestra que incluso si los dos servidores están cerrados, aún se puede acceder a ellos. Como se muestra en la figura siguiente, la lista de servicios aún se obtiene del servidor y se puede ver que no es necesario obtener el servicio. lista después.

 Pero cuando cerramos todos los servidores. El acceso sigue estando bien porque la lista de servicios está almacenada en caché.

 Pero reiniciemos serviceconsume, no volverá a funcionar.

En resumen, hemos completado la configuración de alta disponibilidad del servidor en springcloud

Supongo que te gusta

Origin blog.csdn.net/baidu_39322753/article/details/110237488
Recomendado
Clasificación