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 微服务之间调用相关推荐

  1. feign调用多个服务_Spring Cloud多个微服务之间调用代码实例

    这篇文章主要介绍了Spring Cloud多个微服务之间调用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现在又一个学生微服务 user ...

  2. Spring Cloud中如何保证各个微服务之间调用的安全性

    一.背景 微服务架构下,我们的系统根据业务被拆分成了多个职责单一的微服务. 每个服务都有自己的一套API提供给别的服务调用,那么如何保证安全性呢? 不是说你想调用就可以调用,一定要有认证机制,是我们内 ...

  3. spring cloud微服务之间调用Feign

    微服务之间调用Feign 1.在调用方添加feign依赖: <dependency><groupId>org.springframework.cloud</groupId ...

  4. 微博中微服务缓存_微服务之间调用超时的设置治理

    原标题:微服务之间调用超时的设置治理 作者 | 奇正 微服务是⼀种分布式架构,系统内各部分(服务)被部署为单独的应用程序,并通过某种远程访问协议进⾏通讯.分布式应⽤的挑战之⼀就是如何管理远程服务的可用 ...

  5. 微服务之间调用经过网关吗_微服务网关入门

    一.什么是服务网关服务网关 = 路由转发 + 过滤器 1.路由转发:接收一切外界请求,转发到后端的微服务上去: 2.过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验.限流以及监控等,这些都可 ...

  6. Spring Cloud【Finchley】实战-03订单微服务与商品微服务之间的调用

    文章目录 Spring Cloud[Finchley]专栏 概述 HTTP方式之RestTemplate 方式一 (直接使用restTemplate访问URL,url写死) 方式二 (使用LoadBa ...

  7. 微服务之间的最佳调用方式

    上一篇:3600万中国人在抖音"上清华" 0.2T架构师学习资料干货分享 茉莉花,别名:茉莉,拉丁文名:Jasminum sambac (L.) Ait,木犀科.素馨属直立或攀援灌 ...

  8. SpringCloud服务之间调用,报异常Method has too many Body parameters: public abstract

    问题: SpringCloud 或 SpringCloud Alibaba 开发中微服务之间调用遇到问题:Method has too many Body parameters: public abs ...

  9. spring cloud eureka 服务之间调用_Spring-cloud微服务实战【一】:微服务的概念与演进过程...

    本文是一个系列文章,主要讲述使用spring-cloud进行微服务开发的实战.在开始之前,我们先说一下从传统的单一部署架构到微服务的发展过程,以便让童鞋们更好的理解微服务的概念与演进过程. 1.单体架 ...

最新文章

  1. ThreadLocal 面试六连问,你能 Hold 住吗?
  2. SecureCRT学习之道:SecureCRT经常使用快捷键设置与字体设置方法
  3. 手工搭建APACHE服务
  4. Linux 信号量 生产者消费者小例题
  5. python 实例 cadu_【示例详解】AutoCAD处理控件Aspose.CAD 8月新更!支持加载大型DWG文件...
  6. selenium控制浏览器
  7. Mariadb数据库设置及操作 一主多从 备份还原(实测笔记)
  8. 6.gloox 之 MessageHandler
  9. bzoj1047-理想的正方形(二维单调队列)
  10. BOOST库介绍(六)——容器
  11. NAIPC2016 I. Tourists【LCA】
  12. BZOJ5287 HNOI2018毒瘤
  13. 天池比赛——docker初步尝试
  14. Amendment Quotation function in CLCL Plugin
  15. 南方cass字体样式设置_为什么装了CASS所有字体,还是有文字显示问号?
  16. 1.1.7. Least Angle Regression(最小角回归)和 1.1.8. LARS Lasso
  17. 计算机网络与网络管理 基础知识
  18. VUE实现PDF在线阅读
  19. [Violet]蒲公英(分块)
  20. 2021级新生程序设计班级天梯赛:1-6 《从你的全世界路过》

热门文章

  1. 作业4:结对编程项目四则运算
  2. JOSN的stringify()和parse()方法
  3. 设计模式之MVC设计模式初阶
  4. [置顶] 杂七杂八
  5. CYYMysql 源码解读 1
  6. 大数据之-Hadoop环境搭建_hadoop目录结构---大数据之hadoop工作笔记0019
  7. VC++多线程工作笔记0002---线程的运行状态
  8. 嵌入式工作笔记0002---认识CRT显示器
  9. SpringCloud工作笔记085---SpringBoot项目中防止跨站脚本攻击功能添加
  10. 数据库工作笔记011---Centos7.3下切换mysql数据库的存储位置_挂盘_目录挂载_挂载某个目录到某个设备下