服务间调用

​ 微服务中,很多服务系统都在独立的进程中运行,通过各个服务系统之间的协作来实现一个大项目的所有业务功能。服务系统间 使用多种跨进程的方式进行通信协作,而RESTful风格的网络请求是最为常见的交互方式之一。

http。

​ 思考:如果让我们写服务调用如何写。

  1. 硬编码。不好。ip域名写在代码中。目的:找到服务。

  2. 根据服务名,找相应的ip。目的:这样ip切换或者随便变化,对调用方没有影响。

    Map<服务名,服务列表> map;

  3. 加上负载均衡。目的:高可用。

spring cloud提供的方式:

  1. RestTemplate
  2. Feign

我个人习惯用RestTemplate,因为自由,方便调用别的第三方的http服务。feign也可以,更面向对象一些,更优雅一些,就是需要配置。

1 REST ful

RESTful网络请求是指RESTful风格的网络请求,其中REST是Resource Representational State Transfer的缩写,直接翻译即“资源表现层状态转移”。
Resource代表互联网资源。所谓“资源”是网络上的一个实体,或者说网上的一个具体信息。它可以是一段文本、一首歌曲、一种服务,可以使用一个URI指向它,每种“资源”对应一个URI。
Representational是“表现层”意思。“资源”是一种消息实体,它可以有多种外在的表现形式,我们把“资源”具体呈现出来的形式叫作它的“表现层”。比如说文本可以用TXT格式进行表现,也可以使用XML格式、JSON格式和二进制格式;视频可以用MP4格式表现,也可以用AVI格式表现。URI只代表资源的实体,不代表它的形式。它的具体表现形式,应该由HTTP请求的头信息Accept和Content-Type字段指定,这两个字段是对“表现层”的描述。
State Transfer是指“状态转移”。客户端访问服务的过程中必然涉及数据和状态的转化。如果客户端想要操作服务端资源,必须通过某种手段,让服务器端资源发生“状态转移”。而这种转化是建立在表现层之上的,所以被称为“表现层状态转移”。客户端通过使用HTTP协议中的四个动词来实现上述操作,它们分别是:获取资源的GET、新建或更新资源的POST、更新资源的PUT和删除资源的DELETE。

RestTemplate是Spring提供的同步HTTP网络客户端接口,它可以简化客户端与HTTP服务器之间的交互,并且它强制使用RESTful风格。它会处理HTTP连接和关闭,只需要使用者提供服务器的地址(URL)和模板参数。

2 调用

讲一下发送验证码逻辑。

{
  "receivers": [
    "13412341234","手机号"
  ],
  "data": [
    {
      "id": "SMS_144145499",
      "templateMap": {
        "code": "9876"
      }
    }
  ]
}

为什么这么设计?

在当时业务初期用腾讯,后来换成了阿里,最后又加了华信。为了同时支持腾讯、阿里、华信等短信服务商。

例子:

  1. 启动eureka(为了方便用单节点:7900)。
  2. 启动service-sms,8002。
    • yapi验证是否启动成功,接口能否访问。
    • 验证是否注册到eureka。
  3. 用下面两种方式。

2.1 直接用RestTemplate调用

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

// 正常 ribbon调用
ResponseEntity<ResponseResult> resultEntity = restTemplate.postForEntity(url, smsSendRequest, ResponseResult.class);
ResponseResult result = resultEntity.getBody();


启动api-driver。执行:yapi->api-driver 司机获取验证码。

2.2 feign调用

接口加注解,方法加注解
@FeignClient(name = "service-sms")
public interface SmsClient {
	/**
	 * 按照短信模板发送验证码
	 * @param smsSendRequest
	 * @return
	 */
	@RequestMapping(value="/send/alisms-template", method = RequestMethod.POST)
	public ResponseResult sendSms(@RequestBody SmsSendRequest smsSendRequest);
}

开启feign。
pom中feign。

启动api-driver。执行:yapi->api-passenger 发送验证码。

在使用@FeignClient进行服务调用时,需要按照以下步骤进行操作: 1. 添加Feign依赖:在项目的pom.xml文件中添加Feign的依赖。 ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 2. 创建Feign客户端接口:创建一个接口,使用@FeignClient注解指定要调用服务名称。 ```java @FeignClient(name = "service-provider") public interface ServiceProviderClient { // 定义要调用服务接口方法 @GetMapping("/api/service") String getServiceData(); } ``` 3. 调用服务接口:在需要调用服务的地方,通过依赖注入的方式使用Feign客户端接口。 ```java @RestController public class MyController { @Autowired private ServiceProviderClient serviceProviderClient; @GetMapping("/api/data") public String getData() { // 调用远程服务接口 String serviceData = serviceProviderClient.getServiceData(); // 处理返回的数据 return serviceData; } } ``` 在上述代码中,Feign客户端接口中的方法定义与服务提供者的接口方法一致,通过调用该方法即可实现远程服务调用。Feign会根据@FeignClient注解中指定的服务名称进行服务发现,并生成对应的代理类来执行远程调用。 需要注意的是,使用@FeignClient进行服务调用还需要配置服务注册中心和服务提供者的相关信息,如注册中心地址、服务提供者的URL等。具体配置在项目的配置文件中进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值