Spring boot2X Consult 는 어떻게 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결과 되 돌리 기
hello,provider 또는 hello,another provider주:
결과 가 교체 되 어 나타 난 것 은 부하 이퀄 라이저 가 폴 링 방식 을 채택 하기 때문이다.
설명:
호출 과정:
A.LoadBalancer Client 를 통 해 서 비 스 를 조회 합 니 다.
B.RestTemplate 를 통 해 원 격 서 비 스 를 호출 합 니 다.
리본 부하 균형 전략
시작 클래스 수정
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
출력 결 과 는 더 이상 교체 되 지 않 고 랜 덤 으로 바 뀌 었 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.