이전 공유를 통해 Microservice Architecture의 여러 핵심 시설에 대해 배웠습니다. 이러한 구성 요소를 통해 간단한 마이크로 서비스 아키텍처 시스템을 구축 할 수 있습니다. 예를 들어, Spring Cloud Eureka를 통해 사용 가능한 서비스 등록 센터를 구축하고 서비스 등록 및 발견을 실현하십시오.
스프링 클라우드 리본 또는 feign으로로드 밸런싱; 스프링 클라우드 hystrix를 사용한 서비스 결함 내전 보호 기능이 확산 실패를 피하십시오. 마이크로 서비스가 구축 된 후에는 통화를 위해 외부 시스템에 통합 된 RESTFUL API 서비스 인터페이스를 확실히 제공 할 것입니다.
그러나 외부 시스템이 RESTful API를 호출 할 때 필요한 특정 기능을 제공하는 데 필요한 서비스를 어떻게 결정합니까? 여기에는 라우팅 규칙 및 서비스 인스턴스 목록의 유지 관리가 포함됩니다.
이것은 오늘날 우리의 주인공 인 Spring Cloud Zuul을 소개합니다. Spring Cloud Zuul은 Netflix Zuul 구현을 기반으로 한 API 게이트웨이 구성 요소입니다. 두 가지 주요 문제를 해결할 수 있습니다.
자,이 게이트웨이 서비스를 구현하는 방법을 살펴 보겠습니다.
1. 게이트웨이를 구축하고 라우팅을 구성하십시오
여기서 우리는 여전히 이전 hello-service 및 feign-consumer 서비스를 사용해야합니다. 우리는 Feign-Consumer를 서비스 소비자로 간주했지만 Eureka 시스템에서는 각 서비스가 서비스 제공 업체이자 서비스 소비자이므로 Feign-Consumer는 서비스 제공 업체이기도하며 http : // localhost : 9001/Feign-Consumer와 같은 인터페이스가 제공하는 서비스입니다.
다음으로 코드 구조를 갖춘 게이트웨이 서비스를 다음과 같이 구축합니다.
코드 구현 단계 :
새로운 Maven Project API-Gateway를 만듭니다
POM 파일을 수정하십시오
<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/0.0.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelversion> 4.0.0 </modelversion> <groupid> com.sam </groupid> <artifactid> api-gateway </artifactid> <version> 0.0.1-snapshot> <pares> <groupid> org.springframework.boot </groupid> <artifactid> 스프링-부트 스타터-팔렌트 </artifactid> <bersion> 1.5.1.release </version> </parent> <properties> <javaversion> 1.8 </javaversion> </properties> <rependence for version> <pependence 관리자-> <groupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-dependencies </artifactid> <bersion> camden.sr6 </version> <type> pom </type> <scope> 가져 오기 </scope> </feencevency> </sectionement 관리> <!-zuulependence, Spring-Boot-Starter-Actuator/Spring-Boot-Starter-Hystrix/Spring-Boot-Starter-Ribbon-> <pectionency> <groupid> org.springframework.cloud </groupid> <artifactid> Spring-Cloud-Starter-Zuul </artifactid> </fectionements> </project>
새 스타트 업 클래스를 만듭니다
/*** @enablezuulproxy Zuul의 API 게이트웨이 서비스 기능**/@enablezuulproxy@springCloudApplicationPublic Class GateWayApp {public static void main (String [] args) {springApplication.run (GatewayApp.Class, Args); }}새 응용 프로그램을 만듭니다 .properties
Server.port = 5555spring.application.name = API-Gateway#라우팅 규칙 구성에 추가#zuul.routes를 통해 구성합니다. <Route>는 경로의 이름이며 임의로 지정 될 수 있지만 경로 및 URL 세트의 경로 이름은 다음 예에서 볼 수있는 것과 동일해야합니다. 모든 만족/API-A/** 규칙에 대한 액세스는 // localhost : 9001#, http : // api/hello에 액세스 할 때 : // api/hello에 액세스 할 때 : // localhost : 9001#의 주소로 라우팅됩니다. http : // localhost : 9001/hello에 의해 제공된 마이크로 서비스 인터페이스 zuul.routes.api-a.path =/api-a/** zuul.routes.api-a.url = http : // localhost : 9001zuul.routes.api-b.path =/api-b/** zuul.routes.api-b.url = http : // localhost : 9090
테스트, 시작 Eureka, Hello-Service, Feign-Consumer 및 새로 추가 된 API- 게이트 웨이 서비스를 시작한 다음 http : // localhost : 5555/API-A/Feign-Consumer를 방문하십시오.
Feign-Consumer (feign-consonsumer)의 서비스 인터페이스에 성공적으로 액세스했습니다.
위의 단계는 기존 라우팅의 구성을 구현합니다. 이 구성에는 주요 단점이 있으며, 이는 Application.Properties 파일에서 라우팅 규칙의 수동 구성이 필요하다는 것입니다. 서비스가 많이 있으면 유지 보수 워크로드가 매우 커집니다. 유지 보수 비용을 줄이기 위해 다른 경로 - 서비스 지향 경로가 있습니다.
2. 서비스 지향 라우팅
Spring Cloud Zuul 및 Eureka 통합, 우리는 경로 경로를 특정 URL을 매핑하지 않지만 특정 서비스 및 서비스 URL은 Eureka Service Discovery 메커니즘에 의해 자동으로 유지됩니다. 이 유형의 경로는 서비스 지향 경로입니다. 특정 코드 구성은 다음과 같습니다.
POM 파일을 수정하고 유레카 종속성을 소개합니다
<!-유레카 종속성 소개-> <pectionency> <groupid> org.springframework.cloud </groupid> <artifactid> Spring-Cloud-Starter-Eureka </artifactid> </dependency>
Application.Properties 구성 파일을 수정하십시오
Server.port = 5555Spring.application.name = API-GatewayZuul.routes.api-a.path =/api-a/**# 여기서 URL 대신 ServiceID를 사용하고 IP+포트 번호 대신 서비스 이름을 사용합니다. zuul.routes.api-A.serviceid = hello-serviceeureka.client.service-url.defaultzone = http : // localhost : 1111/eureka
참고 : zuul.routes.api-a.url = hello-service도 기능을 구현할 수 있지만 정상적인로드 밸런싱 및 결함 내전 보호를 수행 할 수는 없습니다.
테스트, http : // localhost : 5555/API-A/Hello를 방문하십시오
액세스가 성공적이었습니다.
3. 서비스 라우팅에 대한 기본 규칙
서비스 지향 경로에서 <Route> 이름이 임의로이므로 가능합니다.
zuul.routes.hello-service.path =/hello-service/** zuul.routes.hello-service.serviceid = hello-service
<Route> 이름은 서비스 이름입니다. 실제로 실제 응용 프로그램에서는 종종 이런 식으로 이름을 지정합니다. 이러한 규칙이있는 경우 Zuul은 기본적으로 이러한 기능을 구현하여 구성 문제를 더욱 절약 할 수 있습니다.
실험을하고 구성 파일을 다음으로 변경하겠습니다.
Server.port = 5555spring.application.name = API-Gatewayeureka.client.service-url.defaultzone = http : // localhost : 1111/eureka
그런 다음 페이지 액세스 확인
액세스가 성공적이었습니다.
그러나 기본적으로 Eureka의 서비스는 Zuul에 의해 기본 매핑 관계를 생성하여 외부 세계에 공개하지 않는 서비스에도 외부 적으로 액세스 할 수 있도록합니다. 현재 zuul.ignored-services의 자동 라우팅 생성이 필요하지 않은 규칙을 구성 할 수 있습니다. zuul.ignored-services =*인 경우 모든 서비스가 라우팅 규칙을 자동으로 생성하지는 않습니다. 이 시점에서 관련 라우팅 구성은 이전 구성을 통해 수행해야합니다.
================== 화려한 분할 선 ========================
이전에는 많은 문제가 있었지만, 모두 라우팅 규칙 및 서비스 인스턴스 유지 보수 문제라는 한 가지 문제를 중심으로합니다. 그렇다면 두 번째 문제를 해결하는 방법 (중복 문제 확인)?
4. 필터링 요청
API 게이트웨이에서 클라이언트 요청을 확인하기 위해 필터를 사용하여 요청을 가로 채고 필터링 할 수 있습니다. 구현 방법은 비교적 간단합니다. Zuulfilter Abstract 클래스를 상속하고 네 가지 방법을 구현하면됩니다.
API 게이트 웨이 수정 :
추가 필터 클래스
/*** Zuulfilter 상속 및 4 개의 인터페이스 구현** 요청 필터링**/public class accessFilter 확장 zuulfilter {logger logger = loggerfactory.getLogger (accessFilter.class); / * * 필터는 필터를 실행 해야하는지 여부를 결정해야합니다 * * 여기에서 true를 반환하여 필터가 모든 요청에 적용됩니다. * 실제로 사용하면이 기능을 사용하여 필터의 유효 범위를 지정할 수 있습니다. } /** 필터의 특정 논리** 여기서 우리는 Zuul을 ctx.setsendzuulresponse (false)를 통해 요청하고 그것을 라우팅하지 말라고 요청하고 ctx.setResponsestatuscode (401)* / @override public object run () {requestContext = requestConrentContext.getCurrentContex ()를 통해 반환 된 오류 코드를 설정합니다. httpservletrequest request = context.getRequest (); Object AccessToken = request.getParameter ( "AccessToken"); logger.info ( "{} request to {}", request.getMethod (), request.getRequestUrl (). toString ()); if (accessToken == null) {context.SetSendZuulResponse (false); context.setResponsestatScode (401); } return null; } /* FilterType 필터 유형을 반환* 필터가 실행되는 수명주기를 결정합니다. 이는 사전으로 정의되므로 요청이 라우팅되기 전에 실행됩니다. * * pre : 실행 전 필터 : 실행 전 : 요청 및 경로 * 게시물 : 요청 처리가 완료된 후 실행 된 필터 * 오류 : 오류가 발생하면 필터가 실행됩니다 */ @override public String filterType () {return "pre"; } / * * FilterOrder는 필터의 실행 순서를 반환합니다 * * 요청에 한 단계에 여러 필터가있는 경우 메소드의 리턴 값을 기준으로 한 번에 실행해야합니다. }}스타트 업 클래스를 수정하십시오
/*** @enablezuulproxy Zuul의 API 게이트웨이 서비스 기능**/ @enablezuulproxy @springCloudApplicationPublic Class GatewayApp {// @Bean Public AccessFilter AccessFilter () {return new AccessFilter (); } public static void main (String [] args) {springApplication.run (GatewayApp.Class, args); }}시험
) http : // localhost : 5555/hello-service/hello를 방문하십시오. 액세스가 실패했습니다
) http : // localhost : 5555/hello-service/hello? accesstoken = 토큰을 방문하십시오
수정 된 코드 구조 :
5. 확장하고 확장
실제로 라우팅 기능이 실제로 실행될 때 라우팅 매핑 및 요청 전달은 모두 여러 다른 필터로 수행됩니다.
라우팅 매핑은 주로 사전 유형 필터를 통해 완료되며, 이는 요청 경로와 구성된 라우팅 규칙과 일치하며 전달 해야하는 대상 주소를 찾습니다.
요청 전달 부분은 경로 필터에 의해 완료되며, 이는 사전 유형 필터로 얻은 경로 주소를 전달합니다.
따라서 필터는 Zuul의 API 게이트웨이 기능의 가장 핵심 구성 요소라고 할 수 있습니다. Zuul에 입력하는 각 HTTP 요청은 일련의 필터 처리 체인을 통해 응답하고 클라이언트로 반환됩니다.
요약
위의 것은 Zuul을 사용하여 Spring Cloud에서 API 게이트웨이 서비스를 구현하는 문제입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!