Spring Cloud es una colección ordenada de una serie de marcos. Utiliza la conveniencia de desarrollo de Spring Boot para simplificar hábilmente el desarrollo de la infraestructura del sistema distribuido, como el registro de descubrimiento de servicios, el centro de configuración, el bus de mensajes, el equilibrio de carga, los interruptores de circuitos, el monitoreo de datos, etc., que se puede iniciar y desplegar en un solo clic utilizando el estilo de desarrollo de Spring Boot. La primavera no fabrica repetidamente las ruedas. Solo combina los marcos de servicios relativamente maduros y prácticos desarrollados por varias compañías. Reempaqueta y protege las configuraciones complejas y los principios de implementación a través del estilo de arranque de primavera, y en última instancia, deja a los desarrolladores con un kit de herramientas de desarrollo de sistemas distribuido y fácil de entender fácil, fácil de entender y fácil de mantener.
A continuación, usaremos SpringCloud para implementar una arquitectura de microservicio simple.
Todos los siguientes códigos se han abierto a GitHub, dirección: https://github.com/lynnlovemin/sofservice
Eureka (registro y descubrimiento de servicios)
Primero introducir paquetes de dependencia relacionados
<Parent> <MoupRoMID> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <versión> 1.5.9.release </versión> <lelativePath/> <!-Busque el padre de repository-> </rent> <procesies> <Project.Build.SourceEncoding> UTF-8 </project.build.SourceEncoding> <Project.Reporting.outputEncoding> Utf-8 </project.Reporting.outputEncoding> <Java.version> 1.8 </Java.Version> </propiences> <pendences> <Spendences> <MoupRid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </artifactid> </dependency> <paper> <grupo) <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependency> </pendency> </dependence> <epardency> <proupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-dependencies </artifactid> <version> dalston.rc1 </versión> <proy> pom </sype> <cope> import </cope> </pendency> </dependency> <//dependence> </dependsmanementementementementsment> <1t builtinementementsment> <1t builtinmentementsment> <1t builtinmentementsment> <1t builtinents> <1t builtinents. <MoupRid> org.springframework.boot </groupid> <artifactid> Spring-Boot-Maven-Plugin </arifactid> </glugin> </glugins> </stract> <repositories> <Repository> <id> Spring-Milestones </id> <Name> Spring Milestones </name> <URL> https://repo.spring.io/milestone </sl> <Snapshots> <Dabled> false </habilitado> </snapshots> </repository> </ repository> </ repositories>
Configurar Application.yml
servidor: puerto: 8761eureka: instancia: nombre de host: localhost cliente: registrowitheureka: false fetchregistry: false serviceUrl: defaultzone: http: // $ {eureka.instance.hostname}: $ {server.port}/eureka/Crear una aplicación de clase de inicio
@Entableeurekaserver@springbootapplicationPublic de aplicación de clase {public static void main (string [] args) {springapplication.run (application.class, args); }} Ejecute el método principal y las visitas al navegador: http: // localhost: 8761, y podemos ver la siguiente interfaz en el navegador:
Significa que Eureka se inicia con éxito.
A continuación, nos damos cuenta del saldo de deuda, interruptor de circuito, puerta de enlace y cliente. Todos los servicios deben estar registrados en Eureka, y al visitar Eureka, puede ver todos los servicios registrados.
Cliente (Cliente)
pom.xml
<Parent> <MoupRoMID> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <versión> 1.5.9.release </versión> <lelativePath/> <!-Busque el padre de repository-> </rent> <procesies> <Project.Build.SourceEncoding> UTF-8 </project.build.SourceEncoding> <Project.Reporting.outputEncoding> Utf-8 </project.Reporting.outputEncoding> <Java.version> 1.8 </Java.Version> </propiences> <pendences> <Spendences> <MoupRid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </arfactid> </pepertency> <peperse> <proupid> org.springframework.boot </groupid> <arifactid> spring-boot-sharter-web </artifactid> </spendency> <pendency> <MoupRoD> org.springframework.boot </groupid> <artifactid> spring-boot-starter-test </artifactid> <cope> test </pope> </pendency> </dependency> </spertencs> <epardencyManagement> <pendency> <epardency> <epardency> <uproupid> org.pringframework.cloud </groupid> <artifactid> Spring-Cloud-Dependencies </artifactid> <versever> dalston.rc1 </ververy> <pype> pom </pype> <cope> import </cope> </pendency> </dependency> </dependency> </pendency> </dependencyManemention> <1S construye> <gotins> <glugin> <grupiD> org.springfringwork.prowork.prowork.prowork. <AtifactId> Spring-Boot-Maven-Plugin </artifactid> </glugin> </glugins> </build> <Repositories> <Repository> <id> Spring-Milestones </did> <name> Spring Milestones </name> <url> https://RepO.spring.io/milestone </srl> <Snapshots> <Snabled> </stapshots> </epository> </epository> </ Repository> </ Repository> </ Repository> </ Repository>
Application.yml
Eureka: Cliente: ServiceUrl: Defaultzone: http: // localhost: 8761/eureka/#register aquí en Eureka Server: Port: 8763spring: Aplicación: Nombre: Service-HI
Clase
@SpringBootApplication@EnseableeureKaClient@RestControllerPublic Aplicación de clase {public static void main (string [] args) {springApplication.run (aplicioin.class, args); } @Value ("$ {server.port}") puerto de cadena; // Aquí proporcionamos una interfaz @RequestMapping ("/HI") Public String Home (@RequestParam String Name) {return "Hi"+Name+", soy desde el puerto:"+puerto; }}Feign (saldo de deuda, interruptor de circuito)
pom.xml
<Parent> <MoupRoMID> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <versión> 1.5.9.release </versión> <lelativePath/> <!-Busque el padre de repository-> </rent> <procesies> <Project.Build.SourceEncoding> UTF-8 </project.build.SourceEncoding> <Project.Reporting.outputEncoding> Utf-8 </project.Reporting.outputEncoding> <Java.version> 1.8 </Java.Version> </propiences> <pendences> <Spendences> <MoupRid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </arfactid> </pepertency> <peperse> <proupid> org.springframework.boot </groupid> <arifactid> spring-boot-sharter-web </artifactid> </spendency> <pendency> <MoupRoD> org.springframework.cloud </groupid> <artifactid> spring-ncloud-starter-feign </artifactid> </pepertency> <pendency> <grupoD> org.springframework.boot </proupid> <artifactid> spring-boot-starter-actuator </artifactid> <//dependency> <fependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </pendency> </dependency> </pepertency> <ephependencymanagement> <pendency> <pendency> <proupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-dependencies </artifactid> <versión> dalston.rc1 </lipsion> <proy> pom </type> <cope> importación <//<//</version> dalston.rc1 </sersion> <proy> pom </type> <cope> import </dependenceManagement> <S construye> <glugins> <glugin> <proupid> org.springframework.boot </groupid> <artifactid> spring-boot-maven-plugin </artifactid> </glugin> </glugins> </build> <repositories> <repository> <d> trein <URL> https://repo.spring.io/milestone </sl> <Snapshots> <Dabled> false </habilitado> </snapshots> </repositorio> </ repositories>
Application.yml
Eureka: Cliente: ServiceUrl: Defaultzone: http: // localhost: 8761/eureka/servidor: puerto: 8765spring: aplicación: nombre: servicio-feignfeign: hystrix: habilitado: true
Clase
@Springbootapplication@habilitedScoveryClient@enablefeignClients@enablehytrixDashBoLePublic de aplicación de clase {public static void main (string [] args) {springapplication.run (application.class, args); }}Luego proporcionar un servicio, su función es hacer las funciones de saldo de deuda y interruptores de circuitos
@FeignClient (value = "Service-Hi", Fallback = SchedualServiceHihyStrict.Class) Interfaz pública ProgradeServiceHi {@RequestMapping (valor = "/hi", método = requestmethod.get) String sayshifromclientone (@requestparam (valor = "nombre") String name);} @ComponentPublic Class SchedualServiceHiHyStrict implementa ProchualServiceHi {@Override public String Sayshifromclientone (name de cadena) {return "Lo siento"+nombre; }}FeignClient especificamos el nombre: Service-HI, Fallback especificado al crear el cliente antes. De esta manera, cuando iniciamos varios clientes, podemos ver que se accederá alternativamente a los diferentes puertos finales cuando HTTP solicite. Cuando se detiene el cliente, acceder a la interfaz devolverá un mensaje de error.
Zuul (puerta de enlace de servicio)
En general, no expondremos directamente al cliente al mundo exterior, sino que lo reenviará a través de la puerta de enlace de servicio. Los servicios internos se comunican dentro de la red de área local y no se puede acceder desde el mundo exterior. A través de la puerta de enlace de servicio, también podemos realizar una verificación de seguridad de interfaz e interceptar de manera uniforme. Consulte el código:
pom.xml
<Parent> <MoupRoMID> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <versión> 1.5.9.release </versión> <lelativePath/> <!-Busque el padre de repository-> </rent> <procesies> <Project.Build.SourceEncoding> UTF-8 </project.build.SourceEncoding> <Project.Reporting.outputEncoding> Utf-8 </project.Reporting.outputEncoding> <Java.version> 1.8 </Java.Version> </propiences> <pendences> <Spendences> <MoupRid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </arfactid> </pepertency> <peperse> <proupid> org.springframework.boot </groupid> <arifactid> spring-boot-sharter-web </artifactid> </spendency> <pendency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependency> </dependency> <dependencyManagement> <dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependency> </dependency> </dependencyManagement> <DIARD> <GULTINS> <MOUMPOUMID> org.springframework.boot </groupid> <artifactid> spring-boot-maven-plugin </artifactid> </glugin> </glugins> </build> <repositorios> <repositorio> <d> spring-milestones </id> <name> spring millas </name> <URL> https://repo.spring.io/milestone </sl> <Snapshots> <Encable> false </habilitado> </snstapshots> </ repository>
Application.yml
Eureka: Cliente: ServiceUrl: Defaultzone: http: // Localhost: 8761/eureka/Server: Port: 8080spring: Aplicación: Nombre: Servicio-Zuulzuul: Rutas: API-B: Path:/API/** Servicio: Servicio Feign #ally Solicitudes que comienzan con el acceso a API al servicio de servicio Servicio de servicio Servicio
Clase
@Enablezuulproxy@enableeurekaclient@springbootapplicationPublic de aplicación de clase {public static void main (String [] args) {springapplication.run (application.class, args); }}Inicie la aplicación y el acceso: http: // localhost: 8080/API/HI para acceder a la interfaz que definimos antes. A continuación, interceptamos la interfaz:
/*** FilterType: devuelve una cadena que representa el tipo de filtro. Se definen cuatro tipos de filtros con diferentes ciclos de vida en Zuul, de la siguiente manera: PRE: Antes del enrutamiento: Cuando el enrutamiento POST: después del enrutamiento Error: Envía Error de llamada Filterer: FilterOrder: Filter Order debe filmar: Aquí puede escribir un juicio lógico, si filtrar, este artículo es verdadero, Filtro para siempre. Ejecutar: la lógica específica del filtro. Es muy complicado de usar, incluida la verificación de SQL y NoSQL para determinar si la solicitud tiene permiso para acceder. */@ComponentPublic Class myFilter extiende Zuulfilter {private static log log = loggerFactory.getLogger (myFilter.class); @Override public String filtType () {return "pre"; } @Override public int filterOrder () {return 0; } @Override public boolean deberíafilter () {return true; } @Override public object run () {requestContext ctx = requestContext.getCurrentContext (); HttpservletRequest request = ctx.getRequest (); log.info (string.format (" %s >>> %s", request.getMethod (), request.getRequestUrl (). toString ())); Object accessToken = request.getParameter ("token"); if (accessToken == null) {log.warn ("el token está vacío"); ctx.setsendzuulResponse (falso); ctx.setResponseStatuscode (401); intente {ctx.getResponse (). getWriter (). Write ("Token está vacío"); } catch (excepción e) {} return null; } log.info ("ok"); regresar nulo; }} De esta manera, primero ejecutaremos el método Ejecutar en la clase MyFilter antes de llamar a la interfaz. En este método, podemos hacer una serie de verificaciones de seguridad, como tokens.
Ok, se ha construido una simple arquitectura de microservicio.
Todo el código anterior ha sido abierto a GitHub, dirección: https://github.com/lynnlovemin/sofservice
Lo anterior es la arquitectura de microservicio simple que el editor le presentó. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a tiempo.