이번에는 서비스를 소비하는 방법을 공유합니다. 이전 기사는 FEIGN 소비를 사용하는 것에 대해 이야기하고,이 기사는 REST+RIBBOL 소비 서비스를 사용하고 폴링을 통해 간단한 소비 구성 요소를 사용자 정의합니다. 이 기사의 목적은 다음과 같습니다. 소비 서비스를 사용자 정의한다는 아이디어; 장점이 있으면 "좋아요"하십시오.
REST+RIBBON은 소비자 서비스를 깨닫습니다
서비스 소비자로서, 우리는 1) 서비스 획득과 2) 서비스를 구별하기 위해 두 가지 주요 프로세스를 만들었습니다. 그렇다면 서비스를 얻는 방법과 서비스를 요청하는 방법은 무엇입니까? 아래 수동 다이어그램을 살펴 보겠습니다.
수동 다이어그램에서 소비자가 먼저 서비스 제공 업체의 실제 인터페이스 주소를 얻은 다음 주소를 통해 인터페이스를 호출한다는 것을 알 수 있습니다. 그런 다음 마이크로 서비스 아키텍처의 경우 특정 클래스 IP 또는 포트를 얻은 다음 인터페이스를 호출하는 것이 좋지 않으므로 ServiceID의 개념이 마이크로 서비스에서 등장했습니다. 간단한 프로세스가 도입되었으며 다음은이를 분석하는 예입니다. 먼저 다음과 같은 종속성 추가
<pectionency> <groupid> org.springframework.boot </groupid> <artifactid> 스프링-부트 스타터-web </artifactid> </fectionency> <groupidency> <groupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </arepifactid>
이전 기사에 내장 된 Eureka_Server (서비스 센터) 및 Eureka_Provider (서비스 제공 업체)를 사용하여 테스트 케이스를 수행하겠습니다. 여기서는 eureka_consumer_ribbon 모듈을 소비자 서비스로 재정의합니다. 먼저 서비스 계층 클래스 및 코드를 만듭니다.
@ServicePublic Class userErvice는 userInterface {@autowired Protected RestTemplate RestTemplate; @override public morp <list <mouser >> getUsers (morq rq) {return null; } @override public String getmsg () {String str = resttemplate.getForObject ( "http : // eureka-provider/msg", String.class); Return str; }}주로 resttemplate.getForObject 함수를 사용한 다음 페이지에서 얻은 데이터에 응답하려면 컨트롤러를 정의해야합니다. 단순화하려면 GetMSG 서비스 인터페이스를 사용하여 다음을 테스트하십시오.
@RestControllerPublic Class USERCONTROLLER {@autowired private userervice userervice; @GetMapping ( "/msg") public String getMsg () {return userErvice.getmsg (); }}마지막으로, 우리는 시작 클래스에 다음 코드를 추가합니다. 우리가 소개 한 Eureka 의존성에는 리본 (dalston.release 버전)이 포함되어 있기 때문에 @loadbalanced 태그를 추가해야합니다. 리본은로드 밸런싱 알고리즘을 캡슐화합니다. 이 주석이 추가되지 않으면 나머지 메소드의 URL은 사용 가능한 URL 경로 여야합니다. 물론, 주석이 여기에 추가되면 위에서 언급 한 서비스를 사용할 수 있습니다.
@springbootApplication @enablediscoveryclient // 소비자 클라이언트 공개 클래스 eureKaconsumerRibbonApplication {@bean @loadbalanced //로드 밸런싱 resttemplate resttemplate () {return new RestTemplate (); } public static void main (String [] args) {springApplication.run (eureKaconsumerRibbonApplication.class, args); }}다음은 소비자가 표시 한 효과입니다.
REST+POLL 사용자 정의 간단한 소비 구성 요소
맞춤형 소비 구성 요소는 수동 도면과 거의 동일합니다. 서비스 제공 업체의 실제 인터페이스 주소를 먼저 얻은 다음 REST를 통해 URL을 호출하여 해당 결과 출력을 얻는 것입니다. 다음은 shenniubanlance 구성 요소 클래스입니다.
/** * Shenniu가 2018/6 * <p>에 의해 만들어졌습니다. * rest+eureka+custom client */ @componentpublic class shenniubanlance {@autowired private resttemplate resttemplate; @autowired Private DiscoveryClient DiscoveryClient; / ** * 서비스 실제 주소 concurrenthashMap < "서비스 애플리케이션 이름", ( "실제 인터페이스 IP", 방문 횟수)> */ public static concurrenthashmap <string, list <moservice >> servicesmap = new ConcerThashMap <> (); /** * 서비스 제공 업체 정보 설정 */public void setservicesmap () {// 모든 서비스 제공자 ApplicationName List를 가져옵니다. // (String AppName : AppNames) {// 서비스 제공 업체 목록의 정보 가져 오기 <ServiceInstance> instanceInfos = DiscoveryClient.getInstances (AppName); if (instanceInfos.isempty ()) {계속; } list <moservice> services = new ArrayList <> (); instanceInfos.foreach (b-> {moservice service = new moservice (); // 액세스 된 서비스 수 .SetWatch (0L); // 실제 인터페이스 주소 Service.SetUrl (b.getUri (). toString ()); services.Add (service);}); // ServicesMap.put (AppName.TolowerCase (), Services)를 업데이트합니다. }} / ** * 앱에 따라 선택된 서비스 * * @param appName * / public moservice choiceserViceByAppName (String AppName)은 예외 {appname = appName.tolowerCase (); // 일부 앱 서비스 서비스 컬렉션 목록 <MOSERVICE> SERVICEMAP = servicesMap.get (AppName); if (servicemap == null) {// 모든 앱 서비스 초기화 setservicesmap (); servicemap = servicesmap.get (appname); if (serviceMap == null) {새 예외를 던지십시오 ( "" + appName + "관련 서비스를 찾지 못했습니다"); }} // 가장 적은 수의 방문 MOSERVICE MOSERVICE = SERVICEMAP.STREAM (). // 레코드로드 +1 moservice.setWatch (moservice.getWatch () + 1); MOSERVICE를 반환합니다. } / ** * 서비스 제공 업체 정보를 자동으로 새로 고침 * / @scheduled (fixedDelay = 1000 * 10) public void refreshServicesMap () {setServicesMap (); } / ** * 반환 데이터를 얻기위한 요청 서비스 가져 오기 * * @param appname 응용 프로그램 이름 ApplicationName * @param serviceName serviceName * @param 맵 요청 매개 변수 * @param tclass return type * @param <t> * @return * / public <t> t getServedata (String appName, String ServiceName, map <t) {t) {// 필터를 시도하여 실제 서비스를 얻으려면 moservice service = ChoicesErviceByAppName (AppName); // 서비스 문자열의 URL을 요청합니다. System.out.println (apiurl); result = map! = null? resttemplate.getForObject (apiurl, tclass, map) : resttemplate.getForObject (apiurl, tclass); } catch (예외) {ex.printstacktrace (); } 반환 결과; } / *** 서비스 정보* / 공개 클래스 MOSERVICE { / *** 부하 레코드 수* / 개인 장거리 시계; /** * 실제 인터페이스 주소 : http://xxx.com/api/add */private String URL; 공개 Long GetWatch () {반환 시계; } public void setWatch (Long Watch) {this.watch = Watch; } public String getUrl () {return url; } public void seturl (String URL) {this.url = url; }}}위는 주요 구현 코드입니다. 코드 로직 : 서비스 제공 업체 정보를 앱에 따라 앱에 따라 폴링 방법을 얻으려면 서비스 -LITE는 서비스를 요청합니다. 폴링 구현의 원칙은로드 레코드 번호를 사용하는 것입니다.로드 레코드 번호는 각 요청 후 자동으로 +1입니다. 특정 서비스 제공 업체를 얻으려면 최소 값의 인스턴스가 레코드 번호를 통해 필터링되고 실제 인터페이스 주소 URL이 저장됩니다. 호출은 다음과 같아야합니다 (물론 주석이라고 할 수 있음).
@override public string getmsg () {String str = banlance.getServicedata ( "Eureka-Provider", "Msg", Null, String.class); Return str; }여기에 이전 resttemplate에 @loadbalanced 주석을 추가하여 나머지 요청이 비 IP (즉, serviceID)에 액세스해야합니다. 그렇지 않으면 오류가 다음과 같은 오류가 표시됩니다.
간단히 말해서로드 밸런싱 메커니즘이 있기 때문에 더 이상 IP를 사용할 필요가 없습니다. 이 주석을 제거하면 맞춤형 구성 요소가 성공적으로 실행될 수 있으며 렌더링은 예 1의 렌더링과 동일하며지도는 고수되지 않습니다.
예약을 사용하여 서비스 제공 업체 정보를 새로 고치십시오
마이크로 서비스 아키텍처에서 서비스가 중단되면 클라이언트의 서비스 캐시 정보는 제 시간에 업데이트되어야합니다. 그렇지 않으면 다운 URL에 요청할 수 있습니다. 이 고려 사항에 따라 활성화 된 태그를 사용하여 시간이 새로 고침을 수행했습니다. 먼저 시작 클래스에 @enablescheduling을 추가 한 다음 다음과 같은 서비스 정보를 플래시하는 서비스를 정의하십시오.
/ ** * 서비스 제공 업체 정보를 자동으로 새로 고침 */ @scheduled (FixedDelay = 1000 * 10) public void CompertServicesMap () {setServicesMap (); }테스트 효과를 용이하게하기 위해 서버, 제공자 (2) 및 소비자가 시작되었을 때, 우리는 Port 2005와 함께 제공자 서비스를 시작합니다. 그런 다음 소비자 인터페이스를 새로 고침하여 효과를 확인하십시오.
현재 2005 년 포트를 호출하는 인터페이스가 성공적으로 호출되었음을 알 수 있습니다. 최신 또는 유효하지 않은 서비스가 @Scheduled Timed Service에 추가되면 필요한 것의 요구를 충족시킵니다. 이 콘텐츠가 당신에게 도움이된다고 생각한다면, 좋아합니다. 감사합니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.