第五章 SpringCloud 使用Feign调用服务
来源:互联网 发布:openssh windows 编辑:程序博客网 时间:2024/06/05 19:42
本章节完整源代码地址:https://github.com/kwang2003/springcloud-study-ch05.git
1.项目概要介绍
在第三章和第四章的学习中,我们已经掌握了通过RestTemplate负载均衡机制来调用注册中心中的服务,除了RestTemplate外,SpringCloud还提供了另一个强大的组件Feign,这让客户端开发人员的编码更加简洁高效。
本章节的代码将以第四章的完整代码为基础进行feign改造实现
https://github.com/kwang2003/springcloud-study-ch04.git
2.服务调用者user-service
feign是工作在服务调用者一方的,因此只要改造user-service工程,将其中通过RestTemplate调用message服务的部分改造成feign即可
a)添加Feign依赖
springcloud-user工程
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
b)项目中启用Feign
在UserApplication主函数类上添加@EnableFeignClients
c)编写FeignClient服务
新增一个接口com.pachiraframework.springcloud.user.service.MessageService
接口使用@FeignClients注解进行标注,注解中接受一个参数,标示出客户端要调用的注册中心中服务的id,用于创建Ribbon负载均衡器
接口中的方法和服务提供者中的定义保持一致,注意,这里我们调用的是SmsController中的send2方法,因为这个方法的接收参数添加了@RequestBody参数
package com.pachiraframework.springcloud.user.service;
import java.util.Map;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.pachiraframework.springcloud.user.controller.UserController.SmsSendResponse;
import lombok.Data;
@FeignClient("message-service")
public interface MessageService {
@RequestMapping(method=RequestMethod.POST,value="/message/sms/send2")
public ResponseEntity<SmsSendResponse> send(SmsSendRequest request);
@Data
public static class SmsSendRequest {
/**
* 短信模版ID
*/
private String templateId;
/**
* 要发送的手机号
*/
private String mobile;
/**
* 模版中携带的参数信息
*/
private Map<String, Object> params;
}
}
d)调用方UserController改造
新增一个regist/sms2方法,用于和先前的基于RestTemplate方法调用区分开
具体代码内容如下
package com.pachiraframework.springcloud.user.controller;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.pachiraframework.springcloud.user.service.MessageService;
import com.pachiraframework.springcloud.user.service.MessageService.SmsSendRequest;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequestMapping("/user/")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private MessageService messageService;
@RequestMapping(value= {"regist/sms"})
public ResponseEntity<SmsSendResponse> sms(String mobile){
Random random = new Random();
int next = random.nextInt(10000000);
String code = ""+(10000000-next);
ResponseEntity<SmsSendResponse> response = doSend(mobile, code);
return response;
}
public ResponseEntity<SmsSendResponse> doSend(String mobile,String code) {
final String sendUrl = "http://message-service/message/sms/send";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
map.add("mobile", mobile);
map.add("templateId", "CHECK_CODE");
map.add("params['code']", code);
log.info("发送参数:{}",map);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
ResponseEntity<SmsSendResponse> response = restTemplate.postForEntity(sendUrl, request, SmsSendResponse.class);
return response;
}
@RequestMapping(value= {"regist/sms2"})
public ResponseEntity<SmsSendResponse> sms2(String mobile){
Random random = new Random();
int next = random.nextInt(10000000);
String code = ""+(10000000-next);
ResponseEntity<SmsSendResponse> response = doSendFeign(mobile, code);
return response;
}
public ResponseEntity<SmsSendResponse> doSendFeign(String mobile,String code) {
SmsSendRequest request = new SmsSendRequest();
request.setMobile(mobile);
request.setTemplateId("CHECK_CODE");
Map<String, Object> params = new HashMap<>();
params.put("code", code);
request.setParams(params);
return messageService.send(request);
}
@Data
public static class SmsSendResponse {
/**
* 返回消息
*/
private String message;
/**
* 返回状态码
*/
private String code;
}
}
3.测试改造结果
运行UserApplication程序,访问
http://localhost:8082/user/regist/sms2?mobile=1234567895
阅读全文
0 0
- 第五章 SpringCloud 使用Feign调用服务
- SpringCloud使用Feign进行服务调用
- 3.springcloud中使用Ribbon和Feign调用服务以及服务的高可用
- 使用feign调用restful服务
- 使用feign调用restful服务
- springcloud中的feign使用
- SpringCloud--服务消费者(Feign)
- SpringCloud: 服务消费者(Feign)
- Spring Cloud学习系列第二章:使用Feign调用服务
- springcloud之Feign基本使用
- SpringCloud-----2、Eureka实现服务治理(Feign客户端声明式负载均衡调用服务)
- springcloud入门之服务消费者Feign
- SpringCloud教程三:服务消费者(Feign)
- springcloud feign远程调用熔断详解
- SpringCloud零基础上手(四)——服务发现以及Feign(声明式RESTful服务调用)
- 【SpringCloud】(八):认识Feign及使用
- SpringCloud(六)springcloud feign
- SpringCloud 学习记录(一):服务注册与发现(eureka+feign)
- 2017年10月英语总结
- 常用快捷键
- python爬虫-豆瓣数据爬取-正则匹配
- Noip 2016 换教室
- 匡斌带你飞 专题一 棋盘问题
- 第五章 SpringCloud 使用Feign调用服务
- swagger注解
- 合并K个已排序的链表。返回一个排序链表
- Windows Server 2012 api-ms-win-crt-runtime-l1-1-0.dll 丢失
- controllerBean 扩展开发
- springmvc之初学(1)
- springmvc 通过异常增强返回给客户端统一格式
- 机器学习基石-08-3-Algorithmic Error Measure
- 接口对接的几个等级