文档章节

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

_大侠__
 _大侠__
发布于 06/19 12:59
字数 1128
阅读 26
收藏 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的学习

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

© 著作权归作者所有

共有 人打赏支持
_大侠__

_大侠__

粉丝 31
博文 47
码字总数 53069
作品 0
杭州
程序员
SpringCloud--鸿鹄Cloud分布式微服务云系统

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

itcloud
07/25
0
0
Spring Cloud-honghu Cloud分布式微服务云系统

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

itcloud
04/25
0
0
Spring Cloud-Honghu Cloud分布式微服务云系统(一)

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

明理萝
09/07
0
0
外行人都能看懂的SpringCloud,错过了血亏!

只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)... 所以,这篇主要来讲讲SpringCloud的一些基础的知识。(我就是现学现...

Java3y
08/27
0
0
白话SpringCloud | 第零章:前言

说在前面 大清早醒来,觉得睡不着了。还是起来,写写博客。但最后发现关于的安全相关的还是比较多内容的,也比较专业,怕是一个多小时完不成的,也罢,那就来写写关于前言吧。 说明 《白话S...

oKong
09/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka技术资料总结(不断更新中)

1、Kafka实践:到底该不该把不同类型的消息放在同一个主题中 2、Kafka剖析系列: Kafka剖析(一):Kafka背景及架构介绍 Kafka设计解析(二):Kafka High Availability (上)...

九州暮云
35分钟前
1
0
面向对象设计原则(OOP)

单一职责原则(Single responsibility principle)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。 核心原则:低耦合,高内聚。 一个类,应该只有一个引起它变化的原因,也就是...

gackey
今天
4
0
C++ 锁

C++提供了两种常用的锁,std::lock_guard<Lockable &T>和std::unique_lock<Lockable &T>。通常使用场景下,这两个锁用法一致。即,在构造锁对象时上锁,在析构锁对象时解锁。使用户从上锁/解...

yepanl
今天
4
0
Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
4
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部