018 微服务之间调用
2019独角兽企业重金招聘Python工程师标准>>>
1 服务说明
准备两个maven项目,eureka-sales、eureka-user,通过访问eureka-sales服务调用eureka-user服务,三种访问方式下 eureka-user 代码不变,只是为了提供被访问接口。
1-1 eureka
pom依赖:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-parent</artifactId><version>Camden.SR3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
application.yml
server:port: 8761spring:application:name: eurekaeureka: client:register-with-eureka: falsefetch-registry: falseserver:waitTimeInMsWhenSyncEmpty: 0serviceUrl:defaultZone: http://localhost:${server.port}/eureka/
启动类,加上 @EnableEurekaServer 注解:
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}
1-2 eureka-sales
pom依赖:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-parent</artifactId><version>Camden.SR3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
定义接口:
@RequestMapping("/sales")
public interface SalesRest {@RequestMapping(value = "/queryGoodsList/{type}", method = RequestMethod.GET)Object queryGoodsList(Integer type);
}
接口实现类,根据传入的type,决定以何种方式访问 eureka-user 服务,1 表示 ribbon 方式,2 表示feign 方式,其他数字表示 http 方式:
@RestController
public class SalesRestImpl implements SalesRest {@Autowiredprivate SalesService salesService;@Overridepublic String queryGoodsList(@PathVariable Integer type) {System.out.println("start to queryGoodsList --->");if(type.intValue() == 1) {return salesService.queryGoodsListByRibbon();}else if(type.intValue() == 2) {return salesService.queryGoodsListByFeign();}else {return salesService.queryGoodsListByHttp();}}}
方法实现:
@Service
public class SalesService {@AutowiredRestTemplate restTemplate;@AutowiredUserFeignClient userFeignClient;private static final String RIBBON_URL = "http://user:8082/user/getUserInfo";private static final String HTTP_URL = "http://127.0.0.1:8082/user/getUserInfo";private static final String IP = IpUtil.getIp();public String queryGoodsListByRibbon() {String sales_result = "queryGoodsListByRibbon success : [sales_ip:" + IP + "] ";String result = restTemplate.getForObject(RIBBON_URL, String.class);return sales_result + result;}public String queryGoodsListByFeign() {String sales_result = "queryGoodsListByFeign success : [sales_ip:" + IP + "] ";String result = (String) userFeignClient.getUserInfo();return sales_result + result;}public String queryGoodsListByHttp() {String sales_result = "queryGoodsListByHttp success : [sales_ip:" + IP + "] ";String result = HttpClientUtil.doGet(HTTP_URL);return sales_result + result;}
}
client
@FeignClient(name = "USER")
public interface UserFeignClient {@RequestMapping(value = "/user/getUserInfo", method = RequestMethod.GET)String getUserInfo();
}
1-3 eureka-user
pom依赖:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-parent</artifactId><version>Camden.SR3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
接口:
@RequestMapping("/user")
public interface UserRest {@RequestMapping(value = "/getUserInfo", method = RequestMethod.GET)String getUserInfo();
}
接口实现类:
@RestController
public class UserRestImpl implements UserRest{@Autowiredprivate UserService userService;@Overridepublic String getUserInfo() {System.out.println("start to getUserInfo --->");return userService.getUserInfo(); }}
方法实现,为了验证 ribbon 的负载均衡,这里返回服务的端口号:
@Service("userService")
public class UserService {@Value("${server.port}")private Integer port;public String getUserInfo() {// 当前项目所在IPString ip = IpUtil.getIp();return "getUserInfo success : [user_ip:" + ip + "user_port:" + port + "] ";}}
2 ribbon方式
Ribbon 是 Netflix 发布的负载均衡器,与 Eureka 配合使用时,Ribbon 可以自动从 Eureka Server 获取服务提供者地址列表,并基于负载均衡算法,请求其中某个服务提供者实例。Ribbon的依赖是:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency>
但是 spring-cloud-starter-eureka 中已经包含了 ribbon 依赖,所以直接添加 eureka 即可。
2-1 eureka-sales
pom依赖,这里直接有 eureka 就行,eureka 已经包含了 ribbon 依赖:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-parent</artifactId><version>Camden.SR3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
application.yml
server:port: 8081spring:application:name: saleseureka:client:serviceUrl: defaultZone: http://localhost:8761/eureka/instance:prefer-ip-address: true
启动类,这里把 RestTemplate 注册一下,并且加上 @LoadBalanced 开启负载均衡:
@SpringBootApplication
@EnableDiscoveryClient
public class SalesApplication {@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(SalesApplication.class,args);}}
调用 eureka-user 服务,其中 RIBBON_URL 中的 user 是eureka-user注册到eureka中心的名称,也就是 application.name :
@Service
public class SalesService {@AutowiredRestTemplate restTemplate;private static final String RIBBON_URL = "http://user:8082/user/getUserInfo";private static final String IP = IpUtil.getIp();public String queryGoodsListByRibbon() {String sales_result = "queryGoodsListByRibbon success : [sales_ip:" + IP + "] ";String result = restTemplate.getForObject(RIBBON_URL, String.class);return sales_result + result;}
}
2-2 测试
1. 启动 eureka 2. 启动 eureka-sales 3.启动 eureka-user 4.修改 eureka-user 的 application.yml 文件,将端口改为8083,启动第二个 eureka-user 服务。
访问接口:http://127.0.0.1:8081/sales/queryGoodsList/1
此时以 ribbon 的方式访问10次,结果说明有进行负载均衡
3 feign方式
3-1 eureka-sales
pom依赖,添加 feign 依赖:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency></dependencies></build><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-parent</artifactId><version>Camden.SR3</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
application.yml
server:port: 8081spring:application:name: saleseureka:client:serviceUrl: defaultZone: http://localhost:8761/eureka/instance:prefer-ip-address: true
启动类,添加 @EnableFeignClients 注解:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class SalesApplication {@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(SalesApplication.class,args);}}
创建 feign client 接口,这里的 USER 是 eureka-user 在 eureka 中心的注册名称,里面的接口定义成跟 eureka-user(被调用服务)中的接口一样:
@FeignClient(name = "USER")
public interface UserFeignClient {@RequestMapping(value = "/user/getUserInfo", method = RequestMethod.GET)String getUserInfo();
}
调用 eureka-user 服务:
@Service
public class SalesService {@AutowiredUserFeignClient userFeignClient;private static final String IP = IpUtil.getIp();public String queryGoodsListByFeign() {String sales_result = "queryGoodsListByFeign success : [sales_ip:" + IP + "] ";String result = (String) userFeignClient.getUserInfo();return sales_result + result;}
}
3-2 测试
1. 启动 eureka 2. 启动 eureka-sales 3.启动 eureka-user 4.修改 eureka-user 的 application.yml 文件,将端口改为8083,启动第二个 eureka-user 服务。
访问接口:http://127.0.0.1:8081/sales/queryGoodsList/2
此时以 ribbon 的方式访问10次,结果说明有进行负载均衡
4 http方式
就是自己封装一个 httpclient 的 get 方法,然后访问:
http://127.0.0.1:8081/sales/queryGoodsList/3,然后观察结果,发现并没有自动进行负载均衡:
5 附录
eureka 项目:https://code.aliyun.com/995586041/eureka.git
eureka-sales 项目:https://code.aliyun.com/995586041/ribbon_feign_http_sales.git
eureka-user 项目:https://code.aliyun.com/995586041/ribbon_feign_http_user.git
core-simple 项目:https://code.aliyun.com/995586041/core-simple.git
上文中相关工具方法在 core-simple 中
转载于:https://my.oschina.net/u/2937605/blog/1806509
018 微服务之间调用相关推荐
- feign调用多个服务_Spring Cloud多个微服务之间调用代码实例
这篇文章主要介绍了Spring Cloud多个微服务之间调用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现在又一个学生微服务 user ...
- Spring Cloud中如何保证各个微服务之间调用的安全性
一.背景 微服务架构下,我们的系统根据业务被拆分成了多个职责单一的微服务. 每个服务都有自己的一套API提供给别的服务调用,那么如何保证安全性呢? 不是说你想调用就可以调用,一定要有认证机制,是我们内 ...
- spring cloud微服务之间调用Feign
微服务之间调用Feign 1.在调用方添加feign依赖: <dependency><groupId>org.springframework.cloud</groupId ...
- 微博中微服务缓存_微服务之间调用超时的设置治理
原标题:微服务之间调用超时的设置治理 作者 | 奇正 微服务是⼀种分布式架构,系统内各部分(服务)被部署为单独的应用程序,并通过某种远程访问协议进⾏通讯.分布式应⽤的挑战之⼀就是如何管理远程服务的可用 ...
- 微服务之间调用经过网关吗_微服务网关入门
一.什么是服务网关服务网关 = 路由转发 + 过滤器 1.路由转发:接收一切外界请求,转发到后端的微服务上去: 2.过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验.限流以及监控等,这些都可 ...
- Spring Cloud【Finchley】实战-03订单微服务与商品微服务之间的调用
文章目录 Spring Cloud[Finchley]专栏 概述 HTTP方式之RestTemplate 方式一 (直接使用restTemplate访问URL,url写死) 方式二 (使用LoadBa ...
- 微服务之间的最佳调用方式
上一篇:3600万中国人在抖音"上清华" 0.2T架构师学习资料干货分享 茉莉花,别名:茉莉,拉丁文名:Jasminum sambac (L.) Ait,木犀科.素馨属直立或攀援灌 ...
- SpringCloud服务之间调用,报异常Method has too many Body parameters: public abstract
问题: SpringCloud 或 SpringCloud Alibaba 开发中微服务之间调用遇到问题:Method has too many Body parameters: public abs ...
- spring cloud eureka 服务之间调用_Spring-cloud微服务实战【一】:微服务的概念与演进过程...
本文是一个系列文章,主要讲述使用spring-cloud进行微服务开发的实战.在开始之前,我们先说一下从传统的单一部署架构到微服务的发展过程,以便让童鞋们更好的理解微服务的概念与演进过程. 1.单体架 ...
最新文章
- ThreadLocal 面试六连问,你能 Hold 住吗?
- SecureCRT学习之道:SecureCRT经常使用快捷键设置与字体设置方法
- 手工搭建APACHE服务
- Linux 信号量 生产者消费者小例题
- python 实例 cadu_【示例详解】AutoCAD处理控件Aspose.CAD 8月新更!支持加载大型DWG文件...
- selenium控制浏览器
- Mariadb数据库设置及操作 一主多从 备份还原(实测笔记)
- 6.gloox 之 MessageHandler
- bzoj1047-理想的正方形(二维单调队列)
- BOOST库介绍(六)——容器
- NAIPC2016 I. Tourists【LCA】
- BZOJ5287 HNOI2018毒瘤
- 天池比赛——docker初步尝试
- Amendment Quotation function in CLCL Plugin
- 南方cass字体样式设置_为什么装了CASS所有字体,还是有文字显示问号?
- 1.1.7. Least Angle Regression(最小角回归)和 1.1.8. LARS Lasso
- 计算机网络与网络管理 基础知识
- VUE实现PDF在线阅读
- [Violet]蒲公英(分块)
- 2021级新生程序设计班级天梯赛:1-6 《从你的全世界路过》
热门文章
- 作业4:结对编程项目四则运算
- JOSN的stringify()和parse()方法
- 设计模式之MVC设计模式初阶
- [置顶] 杂七杂八
- CYYMysql 源码解读 1
- 大数据之-Hadoop环境搭建_hadoop目录结构---大数据之hadoop工作笔记0019
- VC++多线程工作笔记0002---线程的运行状态
- 嵌入式工作笔记0002---认识CRT显示器
- SpringCloud工作笔记085---SpringBoot项目中防止跨站脚本攻击功能添加
- 数据库工作笔记011---Centos7.3下切换mysql数据库的存储位置_挂盘_目录挂载_挂载某个目录到某个设备下