美文网首页
SpringCloud 服务间通信

SpringCloud 服务间通信

作者: qyfl | 来源:发表于2019-09-26 22:26 被阅读0次

主要有两种方式一种 Feign,一种 RestTemplate。

Feign

1. 新增依赖

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

2. 在启动类上新增注解

import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@EnableFeignClients
@SpringCloudApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

3. 准备好需要调用那个服务的那些接口

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

// name 是需要调用的服务名
@FeignClient(name = "product")
public interface ProductClient {
    
    // 需要调用的地址
    @GetMapping("/msg")
    String productMsg();
}

4. 通过 Autowired 的方式调用

import com.imooc.order.config.ProductClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ClientController {

    @Autowired
    private ProductClient productClient;

    @GetMapping("/testProductMsg")
    public String getProductMsg() {
        String response = productClient.productMsg();
        return response;
    }
}

RestTemplate

方式一:

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

@RestController
public class ClientController {

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/testProductMsg")
    public String getProductMsg() {
        RestTemplate restTemplate = new RestTemplate();
        ServiceInstance serviceInstance = loadBalancerClient.choose("server_name");
        
        // 使用 loadBalancerClient 通过应用名获取 url,再用 restTemplate 调用
        String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort());
        
        // getForObject 第二个参数是返回类型
        String response = restTemplate.getForObject(url, String.class);
        return response;
    }
}

方式二:

先使用注解的方式定义 RestTemplateConfig

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }
}

再使用 Autowired 的方式使用。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ClientController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/testProductMsg")
    public String getProductMsg() {
        // url 为服务名+地址
        String response = restTemplate.getForObject("http://server_name/xxx/xx",String.class);
        return response;
    }
}

相关文章

网友评论

      本文标题:SpringCloud 服务间通信

      本文链接:https://www.haomeiwen.com/subject/hrjcuctx.html