Spring Cloud中的服务间通信(RestTemplate和Feign)

一、服务间通信简介

一个系统可以由不同的微服务构成,比如一个电商系统可以由订单服务、商品服务、用户服务等共同组成。 这些服务相互独立,但又相互依赖。由于它们相互依赖,所以需要通过通信的方式来进行相互调用。

服务间通信方式主要由两种:
1.HTTP(SpringCloud)
2.RPC(Dubbo)
Spring Cloud中服务间两种restful调用方式:
1.RestTemplate(Spring提供的用于访问Rest服务的客户端)
2.Feign(是Netflix开发的声明式、模块化的HTTP客户端,Feign可帮助我们更好更快的便捷、优雅地调用HTTP API)

二、RestTemplate的使用

假设我们现在在8080端口启动一个test服务。 我们使用“http://localhost:8080/test”可以访问得到一段字符串。 现在我们需要使用RestTemplate调用该服务

RestTemplate使用总结了以下两种方式。
第一种方式:

RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://localhost:8080/test", String.class);
这种方式的弊端很明显,url是写死的。没有用到注册与发现。如果对方使用集群,ip地址动态变化,则这边就相应需要修改。

第二种方式首先要定义一个类,目的是将RestTemplate配置到Bean中

//将RestTemplate配置到Bean中,方便调用和生命周期管理。
@Component
public class RestTemplateConfig {

    @Bean
    @LoadBalanced//开启了客户端负载均衡ribbon功能,并能获取具体的server(这里根据负载均衡规则,获取到具体的服务实例)
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

这边新建一个类开始通过@Autowired自动注入RestTemplate,然后test方法调用restTemplate

@Autowired
private RestTemplate restTemplate;

public String test(){
    //第三种方式,使用Bean配置的形式
    String response = restTemplate.getForObject("http://TEST/msg", String.class);
    return response;
}
第二种方式将RestTemplate的生命周期交由Spring管理。
在url中不用填写地址和端口,而是使用服务的名称(上例中TEST)代替。

三、客户端负载均衡器Ribbon

3.1 Ribbon简介

Ribbon实现软负载均衡,核心有三点:
   服务发现: 发现依赖服务的列表,就是根据服务的名字,把该服务的实例信息都找出来。
   服务选择规则: 依据规则策略,从多个服务中,选择一个有效的服务。
   服务监听: 检测失效的服务

实际对应流程:

使用ServerList(服务发现),将服务下的所有实例都拿到。
使用ServerListFilter(服务监听),将不能使用的实例给过滤掉
使用IRule(服务选择规则),从可用的实例中,选择一个实例。

3.2 更改规则选择器

Ribbon的所有规则选择器必须集成IRule接口,默认采用的选择器为RoundRule,该选择器会轮训选择调用。 如果想要修改选择器,在application.yml中配置即可。

配置方式如下:

# 配置负载均衡器的选择规则,IRule接口。 TEST为要请求服务的名字。
TEST:
  ribbon:
    # 前面的key是固定写法,后面的RandomRule是要使用的规则选择类。该类必须实现IRule接口。
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

上述配置例子是将匹配规则换成了随机的形式。这样对于后台可用的实例,会随机选择一个进行调用。

四 使用Feign进行服务间通信

Feign调用步骤:
1.配置pom文件中引入Feign

2.启动类加入注解

3.声明需要调用的接口

1.配置pom文件中引入Feign和Consul

<!-- Feign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

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

2.启动类加入注解

@SpringBootApplication
@EnableDiscoveryClient//向服务中心注册,为了让其他微服务能调用你
@EnableFeignClients//声明客户端接口(能使用Feign进行调用)
public class ClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }
 
    @Bean //向程序的ioc注入一个bean: restTemplate
    @LoadBalanced //表明这个restRemplate开启负载均衡的功能
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

3.声明需要调用的接口

/**
 * @这个Client由服务提供方提供
 * @添加@FeignClient注解是为了调用方的在服务注册机器上找到服务提供方
 */
@FeignClient(value = "service-provider") //@FeignClient,将接口声明为Feign客户端,这里的service-provider为要调用服务的名称,即applicaiton.yml文件中spring:application:name即(应用本身的名称也是微服务在注册中心上的名称)
public interface ServiceFeignClient {
    @RequestMapping(value = "/hi")
    String hi(@RequestParam("id") String id);
}

使用上述方法,就可以进行服务之间的相互调用了。
同样需要各个服务都注册到注册中心中

Feign的特点:
1.声明式REST客户端(伪RPC)
2.采用了基于接口的注解。

概念参考白话SpringCloud | 第四章:服务消费者(RestTemplate+Ribbon+Feign)_慕课手记

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值