3.应用之间的通信 RestTemplate以及Feign

### SpringCloud中服务间两种resultful调用方式

ResultTemplate

Feign

从上一节可以看到订单服务需要调用商品服务

下面我来简单的说一下ResultTemplate以及Feign

1.ResultTemplate的三种调用方式

上一节商品服务以及订单服务分别在两个不同的系统

在商品服务中


/**
 * 商品服务端
 * Created by ZhuPengWei on 2018/5/11.
 */
@RestController
public class ServerController {

    @GetMapping("/msg")
    public String setMsg() {
        return "this is product msg";
    }
}

在订单服务中怎么去调用或者接受商品服务的消息呢?

1.下面是关于RestTemplate的三种调用方式
/**
 * 客户端
 * Created by ZhuPengWei on 2018/5/11.
 */
@RestController
@Slf4j
public class ClientController {

    /**
     * ResultTemplate第一种调用方式
     * 缺点:url是写死的 多个访问地址对于这个方法是一个大考验
     *
     * @return
     */
    @GetMapping("/getProductMsg1")
    public String getProductMsg1() {
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject("http://localhost:8080/msg", String.class);
        log.info("返回结果:{}", result);
        return result;
    }

    @Autowired
    private LoadBalancerClient loadBalancerClient;


    /**
     * 第二种方式
     * 使用 LoadBalancerClient 通过应用名获取url 然后在使用RestTemplate
     *
     * @return
     */
    @GetMapping("/getProductMsg2")
    public String getProductMsg2() {
        ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");
        String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort()) + "/msg";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        log.info("返回结果:{}", result);
        return result;
    }


    @Autowired
    private RestTemplate restTemplate;

    /**
     * 第三种方式
     * 使用注解
     *
     * @return
     */
    @GetMapping("/getProductMsg3")
    public String getProductMsg3() {
        return restTemplate.getForObject("http://PRODUCT/msg", String.class);
    }
}

第三种方式的配置

@Component
public class RestTemplateConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
2.负载均衡器Ribbon

SpringCloud是客户端发现中间的负载均衡器是Ribbon

其中RestTimeplate, Feign ,zuul都是通过Ribbon实现负载均衡的

也可以通过spring.io官网上的SpringCloud项目查找Ribbon自定义负载均衡的策略(默认轮询)

扫描二维码关注公众号,回复: 2731081 查看本文章
# users是应用的名字 
users:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

可以通过IRule查找实现类名来自定义负载均衡策略

2.Feign

配置pom文件中引入

   <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {

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

定义好使用的接口

package pers.zpw.oder.controller;

import lombok.extern.slf4j.Slf4j;
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;
import pers.zpw.oder.client.ProductClient;

/**
 * 客户端
 * Created by ZhuPengWei on 2018/5/11.
 */
@RestController
@Slf4j
public class ClientController {

    @Autowired
    private ProductClient productClient;

    /**
     * 通过feign调用
     *
     * @return
     */
    @GetMapping("/getProductMsg4")
    public String getProductMsg4() {
        return productClient.msg();
    }
}

Feign调用步骤:

1.引入pom

2.启动类加入注解

3.声明需要调用的接口

猜你喜欢

转载自blog.csdn.net/qq_36144258/article/details/80358855
今日推荐