eureka注册中心和RestTemplate

news2025/1/21 7:47:39

eureka注册中心和restTemplate的使用说明

eureka的作用

  • 消费者该如何获取服务提供者的具体信息

    1.服务者启动时向eureka注册自己的信息

    2.eureka保存这些信息

    3.消费者根据服务名称向eureka拉去提供者的信息

  • 如果有多个服务提供者,消费者该如何选择?

    服务消费者利用负载均衡算法,从服务列表中挑选一个

  • 消费者如何感知服务提供者的健康状态?

    服务提供者每隔30s向eurekaserver发送心跳请求,报告健康状态。

    eureka会更新记录服务列表信息,心跳不正常会被剔除。

    消费者就可以拉取到最新的消息。

在这里插入图片描述

搭载eureka注册中心

1.引入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

2.在启动类加@EnableEurekaServer注解

3.编写配置文件

server:
  port: 10086 #端口

spring:
  application:
    name: eurekaserver #应用名

eureka:
  client:
    service-url: #eureka注册中心地址
      defaultZone: http://localhost:10086/eureka

服务注册

1.加入eureka客服端的依赖

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2.添加客服端的配置

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

服务发现

1.修改url访问路径,用服务名代替ip地址

package cn.itcast.order.web;

import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import cn.itcast.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("order")
public class OrderController {

    @Autowired
    private OrderService orderService;
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
        // 根据id查询订单并返回
        Order order = orderService.queryOrderById(orderId);

        String url="http://userserver/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        order.setUser(user);
        return order;


    }
}

2.加负载均衡的注解

package cn.itcast.order;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

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

   /* @Bean
    public IRule randomRule(){
        return new RandomRule();
    }*/

}

负载均衡

在这里插入图片描述

1.通过定义IRule实现可以修改负载均衡的规则


import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

@Bean
public IRule randomRule(){
    return new RandomRule();
}

2.通过配置文件更改负载均衡规则

userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

RestTemplate接口调用

简介

在项目中,当我们需要远程调用一个 HTTP 接口时,我们经常会用到 RestTemplate 这个类。这个类是 Spring 框架提供的一个工具类。

RestTemplate: The original Spring REST client with a synchronous, template method API.

从上面的介绍中我们可以知道:RestTemplate 是一个同步的 Rest API 客户端。下面我们就来介绍下 RestTemplate 的常用功能。

RestTemplate的使用

1.创建 RestTemplate

@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
    RestTemplate restTemplate = new RestTemplate(factory);
    return restTemplate;
}

	/**
     * 创建 RestTemplate 时需要一个 ClientHttpRequestFactory,
     * 通过这个请求工厂,我们可以统一设置请求的超时时间,设置代理以及一些其他细节。
     * 通过上面代码配置后,我们直接在代码中注入 RestTemplate 就可以使用了。
     * @return
     */
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    factory.setReadTimeout(5000);
    factory.setConnectTimeout(15000);
    // 设置代理
    //factory.setProxy(null);
    return factory;
}

2.方法介绍

getForObject

public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables)
    
public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
  • 参数1:http请求路径
  • 参数2:返回值类型
  • 参数3:url参数 传参数的方式不一样而已,本质是一样的
@Resource
private RestTemplate restTemplate;

	@Test
    void testGetRequestForShopById() {
        String url="http://127.0.0.1:8081/shop/{id}";
        Result result = restTemplate.getForObject(url, Result.class, 1);
        System.out.println(result);
    }
# 响应结果
Result(success=true, errorMsg=null, data={id=1, name=103茶餐厅, typeId=1, images=https://qcloud.dpfile.com/pc/jiclIsCKmOI2arxKN1Uf0Hx3PucIJH8q0QSz-Z8llzcN56-_QiKuOvyio1OOxsRtFoXqu0G3iT2T27qat3WhLVEuLYk00OmSS1IdNpm8K8sG4JN9RIm2mTKcbLtc2o2vfCF2ubeXzk49OsGrXt_KYDCngOyCwZK-s3fqawWswzk.jpg,https://qcloud.dpfile.com/pc/IOf6VX3qaBgFXFVgp75w-KKJmWZjFc8GXDU8g9bQC6YGCpAmG00QbfT4vCCBj7njuzFvxlbkWx5uwqY2qcjixFEuLYk00OmSS1IdNpm8K8sG4JN9RIm2mTKcbLtc2o2vmIU_8ZGOT1OjpJmLxG6urQ.jpg, area=大关, address=金华路锦昌文华苑29, x=120.149192, y=30.316078, avgPrice=80, sold=4215, comments=3035, score=37, openHours=10:00-22:00, createTime=2021-12-22T18:10:39, updateTime=2023-04-06T22:18:52}, total=null)

getForEntity

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)

public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType)

 	/**
 	* 这个方法比getforobject多了一层包装。可以获取更多的响应信息
 	*/
	@Test
    void testGetRequestForShopById_getForEntity() {
        String url="http://127.0.0.1:8081/shop/{id}";
        ResponseEntity<Result> response = restTemplate.getForEntity(url, Result.class,1);
        Result body = response.getBody();
        System.out.println(body);
    }

响应结果

Result(success=true, errorMsg=null, data={id=1, name=103茶餐厅, typeId=1, images=https://qcloud.dpfile.com/pc/jiclIsCKmOI2arxKN1Uf0Hx3PucIJH8q0QSz-Z8llzcN56-_QiKuOvyio1OOxsRtFoXqu0G3iT2T27qat3WhLVEuLYk00OmSS1IdNpm8K8sG4JN9RIm2mTKcbLtc2o2vfCF2ubeXzk49OsGrXt_KYDCngOyCwZK-s3fqawWswzk.jpg,https://qcloud.dpfile.com/pc/IOf6VX3qaBgFXFVgp75w-KKJmWZjFc8GXDU8g9bQC6YGCpAmG00QbfT4vCCBj7njuzFvxlbkWx5uwqY2qcjixFEuLYk00OmSS1IdNpm8K8sG4JN9RIm2mTKcbLtc2o2vmIU_8ZGOT1OjpJmLxG6urQ.jpg, area=大关, address=金华路锦昌文华苑29号, x=120.149192, y=30.316078, avgPrice=80, sold=4215, comments=3035, score=37, openHours=10:00-22:00, createTime=2021-12-22T18:10:39, updateTime=2023-04-06T22:18:52}, total=null)

head请求用的很少见。

Head 与服务器索与get请求一致的相应,响应体不会返回,获取包含在小消息头中的原信息(与get请求类似,返回的响应中没有具体内容,用于获取报头)

HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。

public HttpHeaders headForHeaders(String url, Object... uriVariables)
public HttpHeaders headForHeaders(String url, Map<String, ?> uriVariables)
public HttpHeaders headForHeaders(URI url)
@Test
    void headForHeaders() throws URISyntaxException {
        String url="http://127.0.0.1:8081/shop-type/list";
        URI uri = new URI(url);
        HttpHeaders headers = restTemplate.headForHeaders(uri);
        System.out.println(headers.toString());
    }

head请求的响应

[Content-Type:"application/json", Content-Length:"652", Date:"Wed, 19 Apr 2023 09:49:28 GMT", Keep-Alive:"timeout=60", Connection:"keep-alive"]

在之后的内容之前我们先看看restTemplate的拦截器设置,主要设置请求头或者一些权限认证的需要


import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;

import java.io.IOException;

public class MyRestTemplateInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        HttpHeaders headers = request.getHeaders();
        //设置请求头 做权限认证
        headers.set("authorization","50da33fa5c0a4ccea49a08bcdf3ee757");
        return execution.execute(request,body);
    }
}


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class RestTemplateConfig {



    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        RestTemplate restTemplate = new RestTemplate(factory);
        MyRestTemplateInterceptor restTemplateInterceptor = new MyRestTemplateInterceptor();
        List<ClientHttpRequestInterceptor> list=new ArrayList<>(1);
        list.add(restTemplateInterceptor);
        restTemplate.setInterceptors(list);
        return restTemplate;
    }
    /*@Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        return new RestTemplate(factory);
    }*/

    /**
     * 创建 RestTemplate 时需要一个 ClientHttpRequestFactory,
     * 通过这个请求工厂,我们可以统一设置请求的超时时间,设置代理以及一些其他细节。
     * 通过上面代码配置后,我们直接在代码中注入 RestTemplate 就可以使用了。
     * @return
     */
    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        //设置超时的时间
        factory.setConnectTimeout(10000);
        //客户端从服务端读取数据的超时时间
        factory.setReadTimeout(10000);
        // 设置代理
        //factory.setProxy(null);
        return factory;
    }

}

postForLocation方法

public URI postForLocation(String url, @Nullable Object request, Object... uriVariables)
public URI postForLocation(String url, @Nullable Object request, Map<String, ?> uriVariables)
    /**
    *不做过多的介绍了
    * 主要是与上面的也大差不差。
    */

最后我们看restTemplate中最丰富的一个方法。不用配置拦截器也能实现设置请求头。

exchange这个方法的重载也不少

public <T> ResponseEntity<T> exchange(String url, HttpMethod method,
			@Nullable HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables)
    
    public <T> ResponseEntity<T> exchange(String url, HttpMethod method,
			@Nullable HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables)
  • 参数一:url 请求路径

  • 参数二:method 请求方式

  • 参数三:requestEntity

    这个可以设置请求体和请求头,我们看一下这个类的构造器,我挑了一个参数最多的构造器。

    很明显第一个参数就是请求体,第二个参数就是设置请求头的一个map。

    也就是说我们不用设置拦截器就可以实现复杂的http请求

    public HttpEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers) {
    		this.body = body;
    		HttpHeaders tempHeaders = new HttpHeaders();
    		if (headers != null) {
    			tempHeaders.putAll(headers);
    		}
    		this.headers = HttpHeaders.readOnlyHttpHeaders(tempHeaders);
    	}
    
    
  • 参数四:responseType 响应值类型

  • 参数五:url参数 也可以理解为请求行参数。

底下是一个实列。

/**
     * get请求设置请求头!
     * 设置url参数
     */
    @Test
    void testGetRequestForShop() {
        long shopId = 1l;
        /**
         * authorization: ba8d06d954a04c32bc1e75e2625fe192
         */
        String url="http://127.0.0.1:8081/shop/{id}";
        HttpHeaders httpHeaders=new HttpHeaders();
        httpHeaders.add("authorization","ba8d06d954a04c32bc1e75e2625fe192");
        HttpEntity httpEntity=new HttpEntity(httpHeaders);

        ResponseEntity<Result> result = restTemplate.exchange(url, HttpMethod.GET, httpEntity, Result.class, shopId);
        System.out.println(result.getStatusCode());
        System.out.println("============header==============");
        System.out.println(result.getHeaders());
        System.out.println("=============result==============");
        Object data = result.getBody().getData();
        System.out.println(data);
    }

Entity=new HttpEntity(httpHeaders);

    ResponseEntity<Result> result = restTemplate.exchange(url, HttpMethod.GET, httpEntity, Result.class, shopId);
    System.out.println(result.getStatusCode());
    System.out.println("============header==============");
    System.out.println(result.getHeaders());
    System.out.println("=============result==============");
    Object data = result.getBody().getData();
    System.out.println(data);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于JavaSpringMVC+Mybatis+Jquery高校毕业设计管理系统设计和实现

基于JavaSpringMVCMybatisJquery高校毕业设计管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

CCBN 2023看点分析:国产8K摄像机国产化替代趋势增强

4月21日&#xff0c;为期3天的CCBN 2023&#xff08;第29届中国国际广播电视信息网络展览会&#xff09;在北京首钢会展中心圆满落幕&#xff0c;CCBN展会是亚洲广播电视设备展览会&#xff0c;也是中国广电行业规模最大、影响力最强的国际性展会之一&#xff0c;更是广电行业内…

Linux环境下(CentOS7)CC攻击——如何用CC攻击对网站进行压力测试(仅限于压力测试)

小编温馨提醒&#xff1a;请正确使用ddos攻击&#xff0c;不要用来做违反当地法律法规的事情&#xff0c;否则后果请自负&#xff01;&#xff01;&#xff01;&#xff01; 阿里云服务器链接 &#xff08;学生党可白嫖16个月ECS云服务器&#xff09; 高校计划 - 免费学生云…

通话蓝牙耳机什么牌子好?通话效果好的无线蓝牙耳机

这几年真无线蓝牙耳机市场发展迅速&#xff0c;从音质到续航再到现在的降噪能力&#xff0c;技术的不断进步也让厂家不断推陈出新&#xff0c;但是也导致许多人不知道从何选择&#xff0c;下面整理了几款通话效果不错的无线蓝牙耳机&#xff0c;可做参考。 一、南卡小音舱Lite…

1.栈的介绍-C语言调用函数(一)

目录 源代码变为可执行文件的过程 栈是什么 入栈过程 出栈过程 C语言函数调用栈 寄存器 EAX,EBX,ECX,EDX 寄存器使用约定 栈帧 调用的解释 释放的解释 堆栈操作 函数调用的操作 堆栈的主要指令 push/pop call/leave/ret 函数序和函数跋 我们在数据结构中学习…

事件抽取:Document-level Event Extraction via Parallel Prediction Networks

任务&#xff1a;给定一篇文章&#xff0c;从中提取出一个或多个结构化的事件 Y { y i } i 1 k Y\{y_i\}_{i1}^{k} Y{yi​}i1k​ ,其中每个事件 t t t事件类型 y i t y_{i}^{t} yit​表示是&#xff0c;包含一系列角色 ( r i 1 , r i 2 , . . . , r i n ) (r_{i}^{1},r_{i}^{…

构建高效数据中台——数据只有被使用起来,才能创造价值

产品经理们时常会碰到这种问题&#xff1a; 我刚上线一个功能&#xff0c;请研发同志们帮我拉个数据出来分析&#xff0c;却被残酷告知需要排期。 我这里急得跺脚&#xff0c;但也只能理解。 数据研发们每天有查不完的数据和写不完的表&#xff0c;业务部门要的数据迟迟拿不到&…

ABAP SM30自定义搜素帮助,且带出相关描述,也可回车带出。

本篇文章用SM30字段BUKRS带出BUTXT为例。 MODULE zfzhdm_f4help INPUT.DATA: lt_dynpfields1 TYPE STANDARD TABLE OF dynpread,ls_dynpfields1 TYPE dynpread,lt_return1 TYPE STANDARD TABLE OF ddshretval,ls_return1 TYPE ddshretval,lv_povstepl1 TYPE sy-stepl…

引领文旅新体验!实时云渲染助力打造“永不落幕”的湾区文采会元宇宙

2022年11月25日至27日&#xff0c;2022年粤港澳大湾区公共文化和旅游产品&#xff08;东莞&#xff09;采购会&#xff08;简称“湾区文采会”&#xff09;在广东省东莞市文化馆举行。 文采会期间&#xff0c;文采会元宇宙线上虚拟展厅全新亮相&#xff0c;这艘承载着科技与文化…

优秀的FAQ示例及FAQ页面制作技巧

在网页中问答设计中&#xff0c;虽然说客服会话更有人情味、解决效率更高&#xff0c;但从实际的客户使用情况和使用偏好来看&#xff0c;越来越多的人更喜欢自助服务。数据显示&#xff0c;约67%的受访者会优先选择自助服务&#xff0c;91%的客户使用过帮助中心来解决问题。可…

python进阶知识点汇总

一、函数 1、函数的传参&#xff1a; &#xff08;1&#xff09;值传递&#xff1a;将实际的参数复制一份传递给形参&#xff0c;函数中修改形参时&#xff0c;不会影响到实际参数&#xff1b; def a(b,c2):return bcprint(a(10)) print(a(123,2)) print(a(2))&#xff08;2…

Gitlab添加组、创建用户和项目、权限管理

一、创建组 1、使用root管理员权限来创建组&#xff0c;一个组里面包含多个项目分支&#xff0c;可以将用户来添加到组里进行设置权限&#xff0c;不同的组有不同的权限。 2、输入群组名称、描述、和可见性级别&#xff0c;点击创建群组 二、创建用户 1、普通用户只能访问属于…

静态路由综合实验

目录 实验要求 实验步骤 1.子网划分 2.配置IP和环回 3.配置静态路由&#xff0c;实现全网可达 4.配置缺省路由&#xff0c;使R1-R4可以访问5.5.5.5/24 5.配置空接口防环 6.ping测试 实验要求 1.除R5的环回地址固定以外&#xff0c;整个其他所有网段基于192.168.1.0/2…

【C++】二叉搜索树BST

目录 1.二叉搜索树的性质2.二叉搜索树功能的实现1.二叉搜索树的框架2.插入3.查找4.删除&#xff08;难点&#xff09;解析 3.二叉搜索树功能的递归实现1.查找递归实现2.插入递归实现递归形式中新建节点的链接问题 3.删除的递归实现 4.二叉搜索树部分默认成员函数实现1.构造函数…

SpringBoot(8)日志监控

日志监控 监控的意义使用监控监控原理 自定义监控指标Metrics端点自定义端点 监控的意义 监控服务状态是否宕机监控服务运行指标(内存&#xff0c;虚拟机&#xff0c;线程&#xff0c;请求等)监控程序运行日志管理服务(服务上下线) 监控的实施方式 1.显示监控信息的服务器&am…

低功耗设计方法学——篇Ⅱ

引言 低功耗设计关乎ASIC芯片的性能稳定。对ASIC 特别是一些Soc芯片的设计有着重要的影响&#xff0c;随着集成规模的大幅度增加&#xff0c;芯片自身的功耗问题暴露也越来越明显。低功耗设计的需求和必要性也越来越值得关注。本文就《Low Power Methodology Manual For Syste…

逍遥自在学C语言 | 赋值运算符

前言 在C语言中&#xff0c;赋值运算符用于将一个值赋给变量 这个过程分为两个步骤&#xff1a; 计算赋值运算符右侧的表达式将结果赋给左侧的变量。 C语言提供了多个不同的赋值运算符&#xff0c;包括基本的赋值运算符、复合赋值运算符以及条件赋值运算符等 一、人物简介…

LeetCode121 买卖股票的最佳时机 遍历法和动态规划

题目地址&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股…

Python爬虫之MongoDB

目录 一、Mongo概述 二、安装&下载 1.下载&#xff1a; 2.安装 三、基本命令 插⼊数据 查询数据 修改数据 删除数据 索引 四、Python与MongoDB交互 1.安装pymongo 2.使⽤ 一、Mongo概述 MongoDB是什么&#xff1f; MongoDB是⾮关系型数据库(No sql) 为啥需要…

无线传感网络课程作业 1-dijkstra算法计算最短路径并输出经过的节点

无线传感网络课程作业 1 仅供参考-如有需要可订阅专栏 题目有如下网络图: abc三个数以a=3,b=1,c=1为例 运行环境:anaconda3环境管理工具,Python 3.9.12,Windows 10 22H2算法实现原理流程i).