微服务架构下的RestTemplate调用其他模块接口

微服务架构下的调用其他模块接口

RestTemplate

第一种方式:

写死url

@GetMapping("/server/get")
    public String server() {
        return "Hello,I am Server";
    }

client端

@GetMapping("/client/get")
    public String client() {
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject("http://localhost:8080/server/get", String.class);
        log.info("接收到的数据是:{}", result);
        return result;
    }

缺点

需要制定server的地址,在不知道server地址的情况下很鸡肋

第二种方式:

服务器跟第一种方式一致不变

客户端 使用LocaBalancerClient来获取注册中心中指定应用名称服务的url

@Autowired
    private LoadBalancerClient loadBalancerClient;
@GetMapping("/client/get")
    public String client() {
        RestTemplate restTemplate = new RestTemplate();
        ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");
        String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort() + "/server/get");
        String result = restTemplate.getForObject(url, String.class);
        return result;
    }

第三张方式:

服务端不变

和第二种方式类似,只是把他抽离成一个Bean可以注入进来,主要是@LoadBalanced这个注解

客户端

@Component
public class RestTemplateConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
@Autowired
private RestTemplate restTemplate;

@GetMapping("/client/get")
    public String client() {
        String result = restTemplate.getForObject("http://PRODUCT/server/get", String.class);
        return result;
    }

结果都是一致的

以上三种方法其实主要都是用到RestTemplate,此外这里会涉及到负载均衡,根据请求对象的数量springcloud会使用他自己的默认策略,随机轮询等。

eureka是属于客户端发现,他的负载均衡是软负载。客户端会向服务器。

如eureka向服务器拉去以注册可用的服务信息,根据负载均衡策略直接命中某一台服务器发送请求,这些都是在客户端完成的,并不需要服务器的参与。

负载均衡器组件是:Ribbon

面向服务器的Rest服务请求,自动转化成客户端负载均衡服务调用

  1. RestTemplate
  2. Feign
  3. Zuul

Ribbon说明

实现负载均衡的核心有三点:

  1. 服务器发现
  2. 服务选择规则
  3. 服务监听

主要组件:

  1. ServerList
  2. IRule
  3. ServerListFilter

更改Ribbon负载均衡策略

在配置中添加:

PRODUCT(应用名称):
	ribbon:
		NFLocaBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

要把策略的包名也带上,一下就是策略中的一些策略

Fegin

先说一下怎么用

在客户端引入Fegin依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
	<version>2.1.1.RELEASE</version>
</dependency>

在启动类上加注解:@EnableFeignClients

定义一个去请求某个应用接口的类

@FeignClient(name = “PRODUCT”) 就是你要去请求的某个应用的名称

@FeignClient(name = "PRODUCT")
public interface ProductClient {

    @GetMapping("/server/get")
    String serverGet();
}

在controller中注入进来

@Autowired
private ProductClient productClient;

    @GetMapping("/fegin/get")
    public String feginGet() {
        return productClient.serverGet();
    }

就这样运行访问这个接口就可以拿到数据了

Fegin简单说明:

  1. 声明式REST客户端(伪RPC)
  2. 采用基于接口的注解

本质上还是HTTP客户端,内部也是Ribbon作为负载均衡器

你可能感兴趣的:(springcloud,springcloud)