Spring boot2X Consult 는 어떻게 RestTemplate 를 통 해 서비스 호출 을 실현 합 니까?

이 글 은 주로 spring boot2X Consul 이 RestTemplate 를 통 해 서비스 호출 을 어떻게 실현 하 는 지 를 소개 합 니 다.이 글 은 예시 코드 를 통 해 매우 상세 하 게 소개 되 어 있 으 며 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 으 므 로 필요 한 분 들 은 참고 하 시기 바 랍 니 다.
Consul 은 분포 식 시스템 의 서비스 발견 과 설정 을 실현 하 는 데 사용 할 수 있 습 니 다.
서비스 호출 은 두 가지 방식 이 있 습 니 다.
A.RestTemplate 를 사용 하여 서비스 호출
부하 균형―리본 주 해 를 통 해 RestTemplate
B.Feign 을 사용 하여 성명 식 서비스 호출
부하 균형-기본적으로 리본 사용 실현
먼저 RestTemplate 를 사용 하여 실현 합 니 다.
1.서비스 등록 발견 센터
시작 컨설팅

consul agent -dev
2.서버
spring boot2X 통합 Consul 을 바탕 으로
서비스 공급 자 추가,provider 1
provider 테스트 방법

package com.xyz.provider.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class demoController {
 @RequestMapping("/hello")
 public String Hello(){
  return "hello,provider";
 }
}
provider 1 테스트 방법

package com.xyz.provider1.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class demoController {
 @RequestMapping("/hello")
 public String Hello(){
  return "hello,another provider";
 }
}
provider 와 provider 1 시작
브 라 우 저 접근http://localhost:8500

두 개의 서비스 제공 자 노드 인 스 턴 스 가 있 습 니 다.

3.클 라 이언 트
(1)의존 도 추가

<properties>
  <java.version>1.8</java.version>
  <spring-cloud.version>Greenwich.SR4</spring-cloud.version>
 </properties>

 <dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

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

</dependencies>

<dependencyManagement>
  <dependencies>
   <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring-cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
   </dependency>
  </dependencies>
</dependencyManagement>
(2)설정 추가

server.port=8015
spring.application.name=xyz-comsumer
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.register=false
spring.cloud.consul.discovery.health-check-url=/actuator/health
spring.cloud.consul.discovery.heartbeat.enabled=true
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
(3)테스트 방법
모든 등 록 된 서 비 스 를 가 져 옵 니 다.등 록 된 서비스 에서'서비스 호출'을 선택 하 십시오.

package com.xyz.comsumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class HelloController {
 @Autowired
 private LoadBalancerClient loadBalancer;
 @Autowired
 private DiscoveryClient discoveryClient;
 private String serviceName = "service-provider";

 @RequestMapping("/services")
 public Object services() {
  return discoveryClient.getInstances(serviceName);
 }

 @RequestMapping("/discover")
 public Object discover() {
  return loadBalancer.choose(serviceName).getUri().toString();
 }

 @RequestMapping("/hello")
 public String hello() {
  ServiceInstance serviceInstance = loadBalancer.choose(serviceName);
  String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
  return callServiceResult;
 }
}
주:
클 라 이언 트 가 호출 한 서비스 이름 은 서버 에서 지정 한 것 입 니 다.서버 설정 에서 spring.cloud.consul.discovery.service-name 을 사용 하면 Consul 에 등 록 된 서비스 이름 을 말 합 니 다.
테스트
시작 컨설팅
provider 와 provider 1 시작
comsumer 시작
테스트 주소http://localhost:8015/services
결과 되 돌리 기

[
 {
  "instanceId": "provider-8010",
  "serviceId": "service-provider",
  "host": "hkgi-PC",
  "port": 8010,
  "secure": false,
  "metadata": {
   "secure": "false"
  },
  "uri": "http://hkgi-PC:8010",
  "scheme": null
 },
 {
  "instanceId": "provider-8011",
  "serviceId": "service-provider",
  "host": "hkgi-PC",
  "port": 8011,
  "secure": false,
  "metadata": {
   "secure": "false"
  },
  "uri": "http://hkgi-PC:8011",
  "scheme": null
 }
]
테스트 주소http://localhost:8015/discover
결과 되 돌리 기
  •   http://hkgi-PC:8011 혹시http://hkgi-PC:8011
  • 테스트 주소http://localhost:8015/hello 반환 결과
    hello,provider 또는 hello,another provider주:
    결과 가 교체 되 어 나타 난 것 은 부하 이퀄 라이저 가 폴 링 방식 을 채택 하기 때문이다.
    설명:
    호출 과정:
    A.LoadBalancer Client 를 통 해 서 비 스 를 조회 합 니 다.
    B.RestTemplate 를 통 해 원 격 서 비 스 를 호출 합 니 다.
    리본 부하 균형 전략
  •   BestAvailableRule
  •   AvailabilityFilteringRule
  •   WeightedResponseTimeRule
  •   RetryRule
  •   RoundRobinRule
  •   RandomRule
  •   ZoneAvoidanceRule
  • 사용자 정의 Ribbon 부하 균형-무 작위 접근 정책 사용
    시작 클래스 수정
    
    package com.xyz.comsumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    @SpringBootApplication
    public class ComsumerApplication {
     public static void main(String[] args) {
      SpringApplication.run(ComsumerApplication.class, args);
     }
    
     @Bean
     @LoadBalanced
     public RestTemplate restTemplate(){
      return new RestTemplate();
     }
    }
    서비스 호출
    
    package com.xyz.comsumer.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    @RestController
    public class RibbonHelloController {
     @Autowired
     private RestTemplate restTemplate;
     private String serviceName = "service-provider";
    
     @RequestMapping("/ribbon/hello")
     public String hello() {
      String callServiceResult = restTemplate.getForObject("http://"+serviceName+"/hello", String.class);
      return callServiceResult;
     }
    }
    설정 추가
    
    service-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
    comsumer 다시 시작
    테스트 주소http://localhost:8015/ribbon/hello
    출력 결 과 는 더 이상 교체 되 지 않 고 랜 덤 으로 바 뀌 었 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기