微服务间通讯负载均衡以及日志

news2024/11/25 14:30:10

2.通信

HTTP ResthttpJSON
RPC远程过程调用二进制

1.使用 RestTemplate

RestTemplate restTemplate = new RestTemplate();
String forObject = restTemplate.getForObject("http://localhot:8888/user", String.class);

其负载均衡有问题其无法实现健康检查

2.使用Ribbon做负载均衡

做负载均衡靠RestTemplate发请求

默认轮询

1.使用DiscoveryClient

服务发现客户端对象

缺点:

没有负载均衡

@RestController
public class OrderController {

    @Autowired
    private DiscoveryClient discoveryClient;
    
    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/invoke")
    public String invoke(){

        List<ServiceInstance> orders = discoveryClient.getInstances("USERS");
        String result = restTemplate.getForObject(orders.get(0).getUri()+"/user",String.class);
        orders.forEach(System.out::println);
        return result;
    }
}

2.使用LoadBalancerClient

负载均衡客户端对象

缺点:

需要每次先根据服务Id获取负载均衡机器后才能调用服务

@RestController
public class OrderController {

    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/invoke")
    public String invoke(){
        ServiceInstance users = loadBalancerClient.choose("USERS");
        String result = restTemplate.getForObject(users.getUri()+"/user",String.class);
        return result;
    }
}

3.@LoadBalance

用在方法上让方法具有负载均衡的作用

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/invoke")
    public String invoke(){
//        4. 在ResuTemplate上加@LoadBalanced
        String result = restTemplate.getForObject("http://USERS/order", String.class);
        return result;
    }

4.负载均衡

父接口IRule

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FvUQjN3h-1673880004157)(C:\Users\wangs\AppData\Roaming\Typora\typora-user-images\image-20230114171505754.png)]

5.OpenFeign

1.写pom

        <!--open feign 依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.写注解

@EnableFeignClients

3.写接口

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

//调用服务Id
@FeignClient(value = "EMPLOYEES")
public interface EmployeeClient {
    //路径
    @GetMapping("/hello")
    public String hello();

    @GetMapping("/emp")
    public String emp();
}

4.调用

    private static final Logger log = LoggerFactory.getLogger(DepartmentController.class);

    @Autowired
    private EmployeeClient employeeClient;

    @GetMapping("/hello")
    public String hello(){
        String hello = employeeClient.hello();
        String emp = employeeClient.emp();
        log.info("h:{}",hello);
        log.info("e:{}",emp);
        return "dep hello"+","+hello+","+emp;
    }
1.调用时零散参数
1.controller
    @GetMapping("/get/{id}/{name}")
    public String get(@PathVariable("id") Integer id,@PathVariable("name") String name) {
        String result = (String) (id+","+name+","+port);
        System.out.println(result);
        return result;
    }

    @GetMapping("/get1")
    public String get1(@RequestParam("id") Integer id,@RequestParam("name") String name){
        String result =  id+","+name+","+port;
        return result;
    }

    @PostMapping("/obs")
    public Animal getdx(@RequestBody Animal animal){
        return animal;
    }
2.feignclient
    @RequestMapping(value = "/get/{id}/{name}",method = RequestMethod.GET)
    public String get(@PathVariable("id") Integer id,@PathVariable("name") String name);

    @GetMapping("/get1")
    public String get1(@RequestParam("id") Integer id,@RequestParam("name") String name);

    @PostMapping("/obs")
    public Animal getdx(@RequestBody Animal animal);

2.调用多个参数

1.数组
1.调用端
    @GetMapping("/test4")
    public String test4(){
        String[] ids = {"1","2","8848"};
        employeeClient.d1(ids);
        return "ok4";
    }
    
2.feign client
    @GetMapping("/d")
    public String d(@RequestParam String[] ids);

3.被调用端
    @GetMapping("/d")
    public String d(@RequestParam String[] ids){
        System.out.println(ids);
        return "hh";
    }
2.List集合(mvc不接受集合类型所以接的时候变对象来接)
1.调用端
    @GetMapping("/test3")
    public String test3(){
        String[] ids = {"1","2","4564"};
        employeeClient.d(ids);
        return "ok3";
    }
2.feign client
    @GetMapping("/d1")
    public String d1(@RequestParam String[] ids);
3.被调用端

   @GetMapping("/d1")
    public String d1(AnimalIdsVo animalIdsVo){
        System.out.println(animalIdsVo.getIds());
        return "hh1";
    }
4.值对象
package com.wsz.pojo.vo;

import java.util.List;

//vo 值对象
public class AnimalIdsVo {
    public List<String> ids;

    public List<String> getIds() {
        return ids;
    }

    public void setIds(List<String> ids) {
        this.ids = ids;
    }
}

6.响应时处理

使用feignclient时其底层是以json的格式进行传递这时可以使用fastjson处理

1.写pom
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.11</version>
        </dependency>
2.使用
    @GetMapping("/test6")
    public String test6(){
        Map<String, Object> data = employeeClient.getMap("1314");
        Object list = data.get("list");
        Object animal = data.get("animal");
        Integer status = (Integer)data.get("status");
        Animal animal1 = JSONObject.parseObject(JSON.toJSONString(animal), Animal.class);
        List<Animal> animals = JSONObject.parseArray(JSON.toJSONString(list), Animal.class);
        log.info("status:{}",status);
        log.info("animal:{}",animal1.toString());
        animals.forEach(animal2 -> log.info("animal2:{}",animal2));
        return "ok";
    }

7.修改openFegin超时时间(默认1s)

#所有服务
feign:
  client:
    config:
      default:
      #连接超时时间为5s
        connectTimeout: 5000
      #等待超时时间为5s
        readTimeout: 5000
        
#单个服务
feign:
  client:
    config:
      EMPLOYEES: #(服务名)
      #连接超时时间为5s
        connectTimeout: 5000
      #等待超时时间为5s
        readTimeout: 5000

8.日志

#开启openfeign日志
logging:
  level:
    com.wsz.feignclient.EmployeeClient: debug
    
feign:
  client:
    config:
      #配置feign日志对象 Map<服务,级别>
      EMPLOYEES:
        loggerLevel: FULL
# 日志级别
## 1.NONE 无
## 2.BASIC 记录请求方法 url 状态码 以及 执行时间
## 3.HEADERS 在2基础上记录请求和响应header
## 4.FULL 记录请求和响应的header body 和元素据 张三全部http协议状态

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

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

相关文章

新年新气象,跨境电商助推出口再创新高

受疫情等多方面影响&#xff0c;2022年纯棉纱进口量及产量均出现一定幅度地下滑。由于库存增加&#xff0c;消费量下降&#xff0c;供需矛盾也不断加剧。 新年新气象&#xff0c;2023年据预计纯棉纱产量将小幅回升&#xff0c;初步预计将达到535万吨&#xff0c;同比增加5.6%。…

Allegro如何快速打开和关闭层面操作指导

Allegro如何快速打开和关闭层面操作指导 在做PCB设计的时候,打开和关闭某个层面是非常频繁的操作,尤其是丝印等等层面。 Allgeo升级到了172版本的时候,可以将常用的层面添加到Visibility菜单里,就不需要频繁打开颜色管理器打卡和关闭层面了,如下图 具体操作如下 打开颜色…

归纳一下软件测试中「安全测试工具」

大家好啊&#xff0c;我是大田。今天归纳一下安全测试工具&#xff0c;分别用这些工具做哪些工作。自动化测试人员、功能测试人员平常可能用的不多&#xff0c;但是面试时也需要准备&#xff0c;需要知道安全测试工具有什么&#xff0c;还要关注现在有哪些漏洞。本篇先归纳整理…

vue3学习笔记之样式穿透(:deep)及CSS 新特性(:soltted、:gloabl、v-bind、mouldCSS)

文章目录1. scoped的原理2. :deep()3. :slotted()4. :global()5. 动态css&#xff08;v-bind&#xff09;6. css module1. scoped的原理 vue中的 scoped 通过在DOM结构以及css样式上加唯一不重复的标记:data-v-hash的方式&#xff0c;以保证唯一&#xff08;而这个工作是由过P…

如何使用极狐GitLab 机器人大幅提升研发效率

本文来自&#xff1a; 黄松 极狐GitLab 后端工程师 研发效率对互联网/科技类公司来说至关重要&#xff0c;效率高意味着你能用更低的人力、时间成本在市场试错&#xff0c;成功的概率也会更大。 而说到研发效率的常见阻碍&#xff0c;主要有两点&#xff1a; 1. 研发流程中需要…

基础二分查找总结

前言 由于我在学习二分查找的过程中处于会了忘&#xff0c;忘了复习的状态&#xff0c;因此总结一套适合自己记忆的模板。建议先看参考资料[1,2,3]^{[1,2,3]}[1,2,3]&#xff0c;理解二分查找各种细节的由来。 二分查找又死循环了&#xff1f;【基础算法精讲 04】手把手带你撕出…

9656教程总结

9656 世界机器人大会青少年电子信息智能创新大赛官网少儿编程办学经验介绍机器人体验展馆体系课程知乎加盟介绍 知识点汇总 年龄 4-6岁 韩纳机器人主题体验馆 赛事 WRC世界机器人大赛, NOC全国中小学信息技术创新和实践大赛 5岁前:乐高积木,孩子年龄小只需对科特、编程…

事关网站数据安全,你真的了解https与SSL证书之间的关系吗?

虽然根据网上的建站教程&#xff0c;大多数站长都知道要给域名添加一个SSL证书&#xff0c;以此来开启https进而可以获得更好的用户体验以及提高网站的安全性。但是SSL证书为什么能使得网站https&#xff1f;你真的去细究过两者之间的关系吗&#xff1f;本文就来说说https与SSL…

python模拟三颗恒星的运动

文章目录随机三体三星问题随机三体 目前来说我们并不关心真实的物理对象&#xff0c;而只想看一下三个随机的点放在三个随机的位置&#xff0c;赋予三个随机的速度&#xff0c;那么这三个点会怎么走。所以其初始化过程为 import numpy as np m,x,y,u,v [np.random.rand(3) f…

【java入门系列四】java基础-数组

学习记录&#x1f914;数组引出动态初始化数组内的数据会自动转换类型注意事项数组赋值机制数组拷贝数组扩容append&#xff1f;多维数组trick生成随机数Math.random()讨论总结谢谢点赞交流&#xff01;(❁◡❁)更多代码&#xff1a; Gitee主页&#xff1a;https://gitee.com/G…

如何进行复盘

复盘定义 复盘&#xff0c;原本是围棋术语&#xff0c;指下完一盘棋后&#xff0c;双方棋手把对弈过程重新摆一遍&#xff0c;看哪里下得好&#xff0c;哪里下得不好&#xff0c;哪些关键节点有不同甚至更好的下法&#xff0c;以检查对局中招法的优劣与得失&#xff0c;并从中…

深入理解可变参数列表

目录 1.前言 2.基本使用方法 1.引入 2.相关宏介绍 3.原理剖析 1.传参 2.va_list 3.va_start() 4.va_arg() 5.va_end() 4.注意事项 5.总结 1.前言 在C语言中&#xff0c;对于一般的函数而言&#xff0c;参数列表都是固定的&#xff0c;而且各个参数之间用逗号进行分开。而除…

面试,演讲为什么一说话就紧张? 的底层解读

信息存在损耗在说话中,说话者与接受者之间传递信息存在损耗。而且人表达情绪不管是说话&#xff0c;还有肢体语言&#xff0c;这使得增加了信息接受者的信息量。下面引入两个词语来说明。给予与流露的含义给予&#xff1a;别人评价你做的菜好吃。流露&#xff1a;别人眉头一皱。…

探讨下如何更好的使用缓存 —— Redis缓存的特殊用法以及与本地缓存一起构建多级缓存的实现

大家好&#xff0c;又见面了。 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容&#xff0c;将会通过系列专题&#xff0c;讲清楚缓存的方方面面。如果感兴趣&#xff0c;欢迎关注以获取后续更新。 通过前面的文章&#xff0c;我们一起剖析了Guava Cache、Caf…

如何在线录屏?怎么录制网课

当我们需要学习特定知识时&#xff0c;可以在网络上寻找教学视频进行学习。一般情况下&#xff0c;视频会一直保留在网上&#xff0c;可以随时随地观看。那您知道我们平常观看的网络课程是如何录制的吗&#xff1f;如何进行在线录屏&#xff1f;今天小编教您如何在线录制视频网…

C语言——指针进阶(含例题及详细代码分析)

文章目录导语&#xff1a;思维导图&#xff1a;1.字符指针2.指针数组3.数组指针3.1 数组指针的定义3.2 &数组名和数组名3.3 数组指针的使用4.数组参数、指针参数4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参5.函数指针6.函数指针数组7.指向函数指针数…

Django自定义认证系统原理及源码分析解读

疑问 Django在如何自定义用户登录认证系统的时候&#xff0c;大家都会里面立马说 自定义一个 或者多个backend&#xff0c;比如通过账号密码、邮箱密码&#xff0c;邮箱验证码、手机号短信验证码等等。 然后设置 在settings中配置一个 AUTHENTICATION_BACKENDS就行。 但是为什…

【尚硅谷】Java数据结构与算法笔记11 - 树结构的实际应用

文章目录一、堆排序1.1 堆排序基本介绍1.2 堆排序的基本思想1.3 堆排序步骤图解1.4 堆排序思路总结1.5 堆排序代码实现二、赫夫曼树2.1 基本介绍2.2 重要概念1.3 赫夫曼树构建思路图解1.4 赫夫曼树代码实现三、赫夫曼编码3.1 基本介绍3.2 原理剖析3.3 实践&#xff1a;数据压缩…

java运算符2023010

运算符&#xff1a; Java语言中的运算符可分为如下几种。 ➢ 算术运算符 ➢ 赋值运算符&#xff0c;/—/各种和等号组合的都是赋值运算符&#xff0c;赋值表达式是有值的&#xff0c;赋值表达式的值就是右边 被赋的值。例如String str2str表达式的值就是str。因此&#xff0c;赋…

Java技能树-操作符(一)-练习篇

算术运算符 执行完下面的代码&#xff0c;变量b的值是&#xff1a; java int a 1; int b a; 答案是&#xff1a;D 在后,先赋值再运算 自动递增和递减 下面代码执行后的结果是&#xff1a; int a 0; a a; int b 0; b b; System.out.println("a " a); S…