spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign。

Ribbon是一个基于HTTP和TCP客户端的负载均衡器,类似nginx反向代理,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon(即不用添加ribbon的jar包也能使用ribbon负载均衡),只要使用@FeignClient时,ribbon就会自动使用。ribbon负载均衡默认使用轮询策略,即多个服务依次轮回调用。

springcloud调用服务的底层原理:

客户端、服务端想注册中心注册服务,注册中心登记了服务的ip,端口号和服务名,当有客户端调用服务时,通过HttpClient技术获取服务的接口信息。

前提:

客户端:service-a

server:
port: 8081
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
spring:
application:
name: service-a

服务端:service-a

server:
port: 8082
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
spring:
application:
name: service-b

一、Ribbon+REST(不常用)

1、在客户端添加依赖包

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

2、在客户端启动类中注册RestTemplate,并使用@LoadBalanced开启负载功能

@EnableEurekaClient
@SpringBootApplication
public class ServiceAApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}

3、在客户端系统中写一个测试controller

@RestController
public class TestController {
@Autowired
RestTemplate restTemplate; @RequestMapping("/hi")
public String hi(@RequestParam String id){
return restTemplate.getForObject("http://service-b/hi?id="+id, String.class);
}
}

4、在服务端系统中提供一个hi()方法,供客户端调用

@EnableEurekaClient
@RestController
@SpringBootApplication
public class ServiceBApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceBApplication.class, args);
}
@Value("${spring.application.name}")
private String name;
@Value("${server.port}")
private String port;
@RequestMapping("/hi")
public String hi(@RequestParam String id){
return "hi, " + id + ", " + name + ":" + port;
}
}

5、重新启动客户端和服务端

6、测试,浏览器访问

http://localhost:8081/hi?id=123

返回结果:

hi, 123, service-b:8082

二、feign(常用)

1、在客户端添加依赖包

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

2、在客户端启动类中使用@EnableFeignClients开启feiginClient功能

@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
public class ServiceAApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAApplication.class, args);
}
}

3、新建一个ServiceAFeignClient接口调用service-b的服务

package com.example.servicea;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Component
@FeignClient(value = "service-b") //这里的name对应调用服务的spring.applicatoin.name
public interface ServiceAFeignClient {
@RequestMapping(value = "/hi")
String hi(@RequestParam("id") String id);
}

4、在客户端系统中写一个测试controller

@RestController
public class TestController {
@Autowired
ServiceAFeignClient serviceAFeignClient; @RequestMapping("/hi")
public String hi(@RequestParam String id){
return serviceAFeignClient.hi(id);
}
}

运行后的结果应该是和ribbon的相同。个人感觉使用feign比较舒服,代码比较简洁。

springcloud微服务架构搭建:服务调用的更多相关文章

  1. 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)

    背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...

  2. spring cloud+dotnet core搭建微服务架构:服务发现(二)

    前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...

  3. spring cloud+.net core搭建微服务架构:服务注册(一)

    背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...

  4. spring cloud+.net core搭建微服务架构:服务发现(二)

    前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...

  5. Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】

    转载:http://blog.didispace.com/spring-cloud-starter-dalston-6-2/ 原创  2017-08-26  翟永超  Spring Cloud 被围观 ...

  6. 【转载】Redis Sentinel 高可用服务架构搭建

    作者:田园里的蟋蟀 出处:http://www.cnblogs.com/xishuai/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 阅读 ...

  7. springcloud微服务架构搭建

    SpringCloud微服务框架搭建 一.微服务架构 1.1什么是分布式 不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 1.2什么是集群 多台服务器部署相同应用构成一个集群 作用:通 ...

  8. 024.微服务架构之服务注册与发现(kubernetes / SpringCloud)

    微服务 微服务是一种架构模式,一种分布式的架构风格. 顾名思义,micro service,将一个庞大的单体应用拆分成若干个“微小”的服务,服务间通过进程通讯完成原本在单体应用中的调用. 其中必要的六 ...

  9. .netcore 3.1高性能微服务架构:封装调用外部服务的接口方法--HttpClient客户端思路分析

    众所周知,微服务架构是由一众微服务组成,项目中调用其他微服务接口更是常见的操作.为了便于调用外部接口,我们的常用思路一般都是封装一个外部接口的客户端,使用时候直接调用相应的方法.webservice或 ...

  10. 微服务架构的服务与发现-Spring Cloud

    1 为什么需要服务发现 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB.KV,去掉重量级ESB),并且强调DevOps和快 ...

随机推荐

  1. Vivado绑定外部verilog编辑器

    前言 由于Vivado自带的verilog编辑器确实难用,写起来效率不高,因而寻找到了以下教程. 解决方案 引用sublime作为vivado外部verilog编辑器 sublime text中文编码 ...

  2. 黄金分割点(第五周 c语言版)

    在上一周,学习其他课程的同时,用C语言编写了黄金分割点小游戏.因为要做界面需要mfc,当时学的时候还做了个简单的计算器.目前c++的知识忘的差不多了,所以就先用C语言来实现算法.打算接下来的一周复习c ...

  3. Final发布点评

    1.  约跑App——nice!:为改进演示效果,本组使用摄像头实时采集投影的方式展示其作品,是一种演示的创新.本组重点放在了修改上次来着其他组发现的bug,不过新功能上好像没有加入多少,可能是保证软 ...

  4. centos 7 安装截图软件shutter

    1.解决 epel-release依赖问题 ,执行命令: yum insatll epel-release 2.然后下载nux-dextop-release-0-5.el7.nux.noarch.rp ...

  5. [知乎]关于WindowsXPx64SP2系统的说明

    自己简单安装了下发现 winxpsp3x86的系统版本为: 然后windowsXPx64sp2的版本为:   作者:qpi667链接:https://www.zhihu.com/question/29 ...

  6. [From WIKI] IBM Z

    IBM zEnterprise System From Wikipedia, the free encyclopedia     Jump to navigationJump to search Hi ...

  7. BOM之screen对象

    前面的话 screen对象在javascript编程中,比较冷门,不太常用.screen对象用来表明客户端的能力,其中包括浏览器窗口外部的显示器的信息,如像素高度和宽度等.本文将详细介绍screen对 ...

  8. Python之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  9. Continuation-passing style

    Continuation-passing style 参考书籍: EOPL (  Essentials of Programming Languages, 3rd Edition ) 作者:知乎用户链 ...

  10. Java中如何遍历Map对象

    方法一:使用map.entrySet()来遍历.这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要的时候使用. Map<String,String> map = new Ha ...