文档章节

SpringCloud 微服务 (六) 服务通信 RestTemplate

___大侠
 ___大侠
发布于 06/19 12:59
字数 1128
阅读 13
收藏 0
点赞 0
评论 0

通信的方式主要有两种,Http 和 RPC

SpringCloud使用的是Http方式通信, Dubbo的通信方式是RPC

记录学习SpringCloud的restful方式: RestTemplate (本篇)、Feign

 

RestTemplate 类似 HttpClient,使用更简洁一些,下面一步一步学习

在之前学习中;在E:/MyCloud的中已经存在名为eureka的注册中心,和一个名为client的服务

不用管,为了区分开学习,重新建两个服务,一个product,一个order,这里不说怎么建了,IDEA一键生成即可(注册中心一直是开启状态)

product 服务端口不设置,在启动项中设置,方便可以开启不同端口的多服务,在第(四)篇有记录,启动一个8081 和 一个8082,便于测试

yml中配置 : (spring.application.name=product 标识name后面会用到)

spring:
  application:
    name: product

eureka:
  client:
    service-url:
     defaultZone: http://localhost:8761/eureka/

加一个简单的接口,product 服务这块就完成了,两个应用都启动(8081,8082)

@RestController
public class ProductsController {

    @GetMapping("/products")
    public String products(){
        return "hello,this is products";
    }
}

在注册中心,可以发现服务,PRODUCT

 

order 服务 端口设置8083,spring.application.name=order,其他基础yml配置与product一致

访问product服务中的接口的几种方式,如下: Controller 代码

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import static java.lang.String.format;

@RestController
@Slf4j
public class OrderController {

    //第二种方式 使用
    @Autowired
    private LoadBalancerClient client;

    //第三种方式 使用
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/get")
    public String getProducts(){
        RestTemplate restTemplate=new RestTemplate();

        //第一种方式 直接请求 getForObject(请求url,返回类型)
        String first_type=restTemplate.getForObject("http://localhost:8081/products",String.class);
        log.info("first response={}",first_type);

        //如果确定就那个一个,用最简单的就好了
        //如果product项目启动不同端口服务,用负载均衡方式,那么第一种方式就比较死气,刚好指向的那个挂了,就不好了

        //第二种方式 通过注册中心,1.获取host+port,2.获取uri 并发出请求
        //choose的参数为注册中心Instances currently registered with Eureka下面Application的名字
        //服务会自己选择一个服务接口发送请求,负载均衡的方式选择有很多,比如随机,顺序等等
        ServiceInstance instance=client.choose("PRODUCT");
        String url= format("http://%s:%s",instance.getHost(),instance.getPort())+"/products";
        String second_type_1=restTemplate.getForObject(url,String.class);
        System.out.println(second_type_1);

        String second_type_2=restTemplate.getForObject(instance.getUri()+"/products",String.class);
        System.out.println(second_type_2);

        //第三种方式,类似第二种方式,需要将restTemplate以注解@bean方式注入,并加上@LoadBalanced注解
        //请求拼接http:// + Application的名字 + 接口名字
        String third_type=restTemplate.getForObject("http://PRODUCT/products",String.class);
        System.out.println(third_type);

        return "";
    }
}

第三种使用到RestTemplateConfig的代码:

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RestTemplateConfig {

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

 

Eureka属于客户端发现,他的负载均衡属于客户端向服务器获取已经注册的可用服务信息,然后根据其负载均衡的策略(随机,顺序等),选其中一个,发送请求,这个过程是在客户端完成的,属于软负载,并不需要服务器的参与

SpringCloud中客户端负载均衡组件是Ribbon,有上面的RestTemplate,还有Feign、zuul等后面继续学习,都使用到Ribbon

Ribbon实现软负载有三点核心:

服务发现 : 找服务,就像上面测试的依据application的名字,找到是哪个服务

服务选择规则 : 从多个服务中,选择一个有效的服务

服务监听 : 检测失效的服务,将不会再去命中失效的服务

Ribbon的主要组件: ServerList、IRule、ServerListFilter等

Ribbon流程 : 通过ServerList获取所有可用服务列表,然后通过ServerListFilter过滤一部分服务, 最后使用IRule选择一个目标

查看Ribbon的源码,发现ServerList方法是过时的,使用另一个getAllServers方法

IRule默认的命中方式是自然顺序的方式,如果想改变方式可以,参考官网的文档如下:

那么我们在yml中加入如下配置: 随机方式(其他方式可以在实现IRule接口的方法中查找,路径须写全)

PRODUCT:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

文档可以找中文的,也可以看官方英文的,看自己爱好,耐心很重要,url: spring.io

 

 

本篇不记录更多了,一段一段消化,下篇再继续Feign的学习

------------------------------------------------------------

© 著作权归作者所有

共有 人打赏支持
___大侠
粉丝 20
博文 32
码字总数 33285
作品 0
杭州
程序员
Spring Cloud-honghu Cloud分布式微服务云系统

简介 鸿鹄云Cloud是基于SpringCloud来封装的,是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现、注册、配置中心、消息总线、负载均衡、断路器...

itcloud
04/25
0
0
SpringCloud实战9-Stream消息驱动

官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架。   应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互,通过我们配置来 binding ,而 Spring Clo...

狂小白
05/29
0
0
Spring Cloud构建微服务架构—服务消费(Ribbon)

Spring Cloud Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置...

itcloud
06/28
0
0
史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)

在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。...

方宏春
04/14
0
0
Springcloud应用在阿里云Kubernetes上的IP互通实践

问题 在应用微服务化方案中,Springcloud是比较常见的选择,毕竟其对于Java 的程序员来说比较友好,基于Springboot的编程方式也使得门槛比较低。但是在将Springcloud的应用运行到Kubernetes容...

了哥-duff
06/25
0
0
SpringCloud学习之Ribbon

一。负载均衡与Ribbon 负载均衡,在集群中是很常见的一个“名词”,顾名思义是根据一定的算法将请求分摊至对应的服务节点上,常见的算法有如下几种: 轮询法:所有请求被依次分发到每台应用服...

java~nick
03/11
0
0
Spring Cloud构建微服务架构服务注册与发现

Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、...

明理萝
06/11
0
0
SpringCloud 微服务 (十一) Spring Cloud Stream MQ-API

壹 上节学习了基础的RabbitMQ,本次继续学习MQ相关API---SpringCloud Stream 看到Stream大致会联想到流,input,output等信息,官网解释SpringCloud Stream是给微服务应用构建消息队列驱动的能力...

___大侠
07/05
0
0
码云携手华为云微服务平台,有礼召集微服务示范项目

继华为云容器平台对接码云(详情)后,华为云的微服务平台也将接入码云,目前正在内测,计划本月内上线。 现在华为云和码云一起为微服务平台征集微服务示范项目。如果您的项目入选“示范项目...

码云Gitee
04/23
0
15
SpringCloud实战10-Sleuth

Spring-Cloud-Sleuth是Spring Cloud的组成部分之一,为SpringCloud应用实现了一种分布式追踪解决方案,其兼容了Zipkin, HTrace和log-based追踪,追踪微服务rest服务调用链路的问题,接触到zip...

狂小白
05/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

编程语言对比分析:Python与Java和JavaScript(图)

编程语言对比分析:Python与Java和JavaScript(图): 凭什么说“Python 太慢,Java 太笨拙,我讨厌 JavaScript”?[图] 编程语言生而为何? 我们人类从原始社会就是用语言表达自己,互相沟通...

原创小博客
5分钟前
0
0
Akka构建Reactive应用《one》

看到这Akka的官网,描述使用java或者scala构建响应式,并发和分布式应用更加简单,听着很高级的样子,下面的小字写着消息驱动,但是在quickstart里面又写容错事件驱动,就是这么钻牛角尖。 ...

woshixin
17分钟前
0
0
ffmpeg源码分析 (四)

io_open 承接上一篇,对于avformat_open_input的分析还差其中非常重要的一步,就是io_open,该函数用于打开FFmpeg的输入输出文件。 在init_input中有这么一句 if ((ret = s->io_open(s, &s-...

街角的小丑
18分钟前
0
0
String,StringBuffer ,StringBuilder的区别

不同点 一、基类不同 StringBuffer、StringBuilder 都继承自AbStractStringBuilder,String 直接继承自 Object 2、底层容器“不同” 虽然底层都是字符数组,但是String的是final修饰的不可变...

不开心的时候不要学习
34分钟前
0
0
nodejs 文件操作

写文件code // 加载文件模块var fs = require("fs");var content = 'Hello World, 你好世界!';//params 文件名,内容,编码,回调fs.writeFile('./hello.txt',content,'utf8',function (er......

yanhl
36分钟前
0
0
SpringBoot mybits 查询为0条数据 但是在Navicat 中可以查询到数据

1.页面请求: 数据库查询: 2018-07-16 17:56:25.054 DEBUG 17312 --- [nio-9010-exec-3] c.s.h.m.C.selectSelective : ==> Preparing: select id, card_number, customer_id, customer_nam......

kuchawyz
46分钟前
0
0
译:Self-Modifying cod 和cacheflush

date: 2014-11-26 09:53 翻译自: http://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code Cache处在CPU核心与内存存储器之间,它给我们的感觉是,它具......

我叫半桶水
48分钟前
0
0
Artificial Intelligence Yourself

TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流...

孟飞阳
今天
0
0
press.one个人数字签名

这是我在press.one的数字签名 https://press.one/p/address/v?s=9d3d5b7ce019af357ab994775549e8f047a5b17fc9893364652fc67e4b95443b38ccb24c6655e0d252dd0154369eb9b7717c4ccf4e1835ca3596......

NateHuang
今天
1
0
Oracle 中的 SQL 分页查询原理和方法详解

本文分析并介绍 Oracle 中的分页查找的方法。 Oracle 中的表,除了我们建表时设计的各个字段,其实还有两个字段(此处只介绍2个),分别是 ROWID(行标示符)和 ROWNUM(行号),即使我们使用...

举个_栗子
今天
4
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部