文章目录

  • 4 Ribbon负载均衡
    • 概述
    • RestTemplate
    • 流程
    • 策略
    • 配置策略
    • 饥饿加载
    • 与Nginx对比
  • 5 OpenFeign远程调用
    • RestTemplate调用的问题
    • 与Feign对比
    • OpenFeign基本使用
    • 超时控制
    • 自定义配置
    • 性能优化
    • 最佳实践
  • 6 Gateway网关
    • 网关功能
    • 技术实现
    • 网关搭建
    • 路由断言工厂
    • 过滤器
      • 配置
      • 全局过滤器
      • 过滤器链执行顺序
    • 跨域配置

4 Ribbon负载均衡

概述

提供客户端的软件负载均衡算法和服务调用

eureka-client已经自带ribbon

RestTemplate

getForObject/postForObject:获取数据转化成的对象,可以理解为json

getForEntity/postForEntity:获取响应头、http状态码、响应体

流程

策略

默认用RoundRobinRule

轮询算法原理:rest接口第几次请求数%服务器集群总数量=实际调用服务器位置下标,每次服务重启后rest接口计数从1开始

配置策略

  1. 代码方式(全局配置)

在@ComponentScan扫描不到的包定义新的策略(不要跟启动类放同一个包)

启动类添加@RibbonClient注解

@Bean
public IRule randomRule() {return new RandomRule();
}
  1. 配置文件方式

可以根据服务名称具体配置

xxxservice: #服务名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

饥饿加载

Ribbon默认使用懒加载,第一次访问时创建对象,消耗时间较多

可以配置饥饿加载,项目启动时创建对象

ribbon:eager-load:enabled: trueclients:- xxxservice

与Nginx对比

  • Ribbon:在消费者端进行的负载均衡,进程内负载均衡

  • Nginx:接收了所有的请求进行负载均衡,集中式负载均衡

5 OpenFeign远程调用

RestTemplate调用的问题

  • 代码可读性差,编程体验不统一

  • 参数复杂url难以维护

与Feign对比

在Feign基础上加入对SpringMVC的支持

OpenFeign基本使用

一个声明式的http客户端

  1. 添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 启动类添加@EnableFeignClients注解

  2. 编写FeignClient接口

@FeignClient("userservice") //userservice为服务名称
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}
  1. 使用FeignClient接口调用方法
//注入UserClient
User user = userClient.findById(id);

超时控制

Feign客户端默认等待1秒

ribbon:ReadTimeout: 5000 #建立连接所用时间ConnectTimeout: 5000 #从服务器读取到可用资源所用时间

自定义配置


配置日志级别:

NONE-无日志

BASIC-仅记录请求方法、URL、响应状态码及执行时间

HEADERS-除了BASIC中定义的信息之外,还有请求和响应的头信息

FULL-除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据

  • 配置文件

    feign:client:config:default: # default:全局配置,也可以使用服务名称loggerLevel: FULL
    
  • 代码

    @Configuration
    public class FeignClientConfig {@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.FULL;}
    } //加在启动类代表全局配置
    @EnableFeignClients(defaultConfiguration = FeignClientConfig.class)//加在FeignClient接口代表单个服务配置
    @FeignClient(value = "userservice", configuration = FeignClientConfig.class)
    

性能优化

  • 使用连接池(HttpClient, OKHttp)代替默认URLConnection

    <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
    </dependency>
    
    feign:httpclient:enabled: true # 开关max-connections: 200 # 最大连接数max-connections-per-route: 50 # 每个路径的最大连接数
    
  • 日志级别用BASIC或NONE

最佳实践

  • 给消费者的FeignClient和提供者的controller定义统一的父接口作为标准

  • 将FeignClient抽取为独立模块,把接口有关的实体类、默认Feign配置放到该模块,提供给所有消费者使用

    定义的FeignClient不在SpringBootApplication的扫描包范围,导致FeignClient无法注入spring容器,如何解决

  • 指定FeignClient所在包

    @EnableFeignClients(basePackages = "xxx")
    
  • 指定FeignClient字节码

    @EnableFeignClients(clients = {UserClient.class})
    

6 Gateway网关

网关功能

  • 身份认证、权限校验

  • 服务路由、负载均衡

  • 请求限流

技术实现

  • gateway:响应式编程(使用的Webflux的reactor-netty响应式编程组件,底层使用Netty通讯框架)

  • zuul:阻塞式编程

网关搭建

  1. 创建模块,引入依赖
<dependencies><!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--nacos服务注册发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2021.1</version></dependency>
</dependencies>
  1. 配置

yml配置

server:port: 10010
spring:application:name: gatewaycloud:nacos:server-addr: localhost:8848 #nacos地址gateway:routes:- id: user-service #路由标识,唯一uri: lb://userservice #路由目标地址predicates: #路由断言,判断请求是否符合规则- Path=/user/** #路径断言,判断路径是否以/user开头

编码配置

@Configuration
public class GatewayConfig {@Beanpublic RouteLocator routeLocator(RouteLocatorBuilder builder) {RouteLocatorBuilder.Builder routes = builder.routes();return routes.route("user-service", r -> r.path("/user/**").uri("lb://userservice")).build();}
}

路由断言工厂

作用:读取并解析配置的断言规则,转变为路由判断的条件

更多参考https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

时区时间点可以用ZonedDateTime类

过滤器

生命周期:pre(前置), post(后置)

种类:GatewayFilter, GlobalFilter

配置

作用:对进入网关的请求和微服务返回的响应做处理

过滤器工厂参考https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

server:port: 10010
spring:application:name: gatewaycloud:nacos:server-addr: localhost:8848 #nacos地址gateway:routes:- id: user-service #路由标识,唯一uri: lb://userservice #路由目标地址predicates: #路由断言,判断请求是否符合规则- Path=/user/** #路径断言,判断路径是否以/user开头#filters:# - AddRequestHeader=headerName,headerValue# 也可以配置默认过滤器,使得所有路由都生效default-filters:- AddRequestHeader=headerName,headerValue

全局过滤器

以代码形式处理一切进入网关的请求和微服务响应

实现GlobalFilter接口,重写filter方法

//过滤器的顺序,值越小优先级越高
@Order(0)
@Component
public class AuthorizeFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> params = request.getQueryParams();String authorization = params.getFirst("authorization");if ("admin".equals(authorization)) {return chain.filter(exchange);}exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}
}

过滤器链执行顺序

请求进入网关,会将路由过滤器、默认过滤器、全局过滤器合并到一个过滤器链,排序后依次执行每个过滤器

每个过滤器指定一个int类型的order值,值越小优先级越高

全局过滤器实现Ordered接口或添加@Order注解指定order值,路由过滤器、默认过滤器的order由Spring指定,按照声明顺序从1开始

如果order值一样,按照默认过滤器>路由过滤器>全局过滤器顺序执行

跨域配置

spring:gateway:globalcors: # 全局跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截corsConfigurations:'[/**]':allowedOrigins: # 允许哪些网站的跨域请求- "xxx"allowedMethods: # 允许跨域ajax请求方式- "GET"- "POST"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 允许携带cookiemaxAge: 360000 # 跨域检测有效期(秒)

微服务学习笔记(二)Ribbon+OpenFeign+Gateway相关推荐

  1. Java微服务学习笔记(一):微服务架构的概念理解

    Java微服务学习笔记 Tips:入门学习时粗略整理,仅供参考 (一):架构的基础理解 文章目录 Java微服务学习笔记 前言 一.微服务是什么? 二.常用开源微服务框架演化 1. Dubbo 2. ...

  2. spring boot 及微服务 学习笔记

    最近在进行项目架构的调整,准备从springmvc转换到spring cloud,也就是微服务框架.自然就需要将原有的项目转化为spring boot形式. 微服务 在了解spring boot之前, ...

  3. 【微服务学习笔记】一、认识微服务及微服务组件

    学习视频参考: B站视频教程:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程 链接:https://www.bilib ...

  4. springcloud微服务学习笔记

    此篇内容较长. 目录 一.关于微服务 二.微服务工程的构建 1.新建maven父工程 2.新建公共模块 3.新建微服务提供者8001 4.新建微服务消费者80 三.服务和发现注册中心(Eureka) ...

  5. docker入门与部署微服务--学习笔记

    最近公司进一步去windows,走向 linux+云化. 原来的一大坨windows虚拟机服务器都要转向linux, 既然走向linux的话,那么docker肯定是要涉足的. 故学习了docker入门 ...

  6. Spring Cloud微服务开发笔记4——Ribbon框架使用方法

    2019独角兽企业重金招聘Python工程师标准>>> 本文介绍Netfilx的第二个框架--Ribbon. (1)Ribbon是Netflix下的负载均衡框架,支持可插拔式的负载均 ...

  7. 微服务学习笔记(一):什么是微服务架构

    一.分享MarkDown小技巧 最初只需要记住 #标题一.## 标题二.1. 第一点.* 这一点,用这几个写写日志.需求文档.小文章,排版上足够了: 逐渐你会发现有些文字需要重点指出,那么还可以使用* ...

  8. SpringCloud 微服务分布式 笔记(二)

    SpringCloud 微服务分布式 本篇是结合上一篇代码进行修改学习 点击

  9. 微服务学习笔记 K8S、ISTIO、微服务、容器不得不说的故事

    微服务运行在容器内:容器依靠K8S进行编排.服务发现.负载均衡等:Istio和K8S进行融合,在利用K8S的一些功能的基础上(服务注册),对K8S进行功能的扩展,追加了一些服务治理功能(熔断.限流.动 ...

最新文章

  1. Docker使用场景一
  2. iOS11和iPhone X的适配
  3. android获取连接wifi名称,android 获取当前连接WIFI名称的有关问题
  4. Java8 Stream 数据流,大数据量下的性能效率怎么样?
  5. vector function trmplate
  6. “黑科技”监控图像技术你知道吗?
  7. Java的数据库编程之背景概述
  8. 开发者日记级别哪个好_什么是开发者日记?
  9. Windows7下无法安装Oracle11.1.0问题
  10. 关于assert和de-assert的解释
  11. java证书验证失败_SVN提示https证书验证失败解决办法
  12. html无限弹窗关不掉,使用cmd命令时出现无限弹窗的故障如何终止
  13. 移动通信技术的未来发展趋势分析
  14. 什么软件可以测试睡眠质量心率,Beddit:粘在床上就能测试心率的睡眠监测器
  15. 服务器在线测速系统源码
  16. 深耕一线14年,见证云计算风起云涌
  17. 数据挖掘背景知识2——数据挖掘可以做到什么 带给我们什么?
  18. 后补贴时代-新能源车企商业模式之“柳州模式”
  19. HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。
  20. VUE前端开发环境版本查看命令

热门文章

  1. 计算机网络自动化,自动化博览
  2. 玩骰子(hdu校赛)
  3. GCC 11 的静态分析功能将得到增强
  4. 图片base64格式解析
  5. Springboot之——不能交给Spring管理的类如何添加注解?
  6. uml里的extend和include_解析UML用例图中include与extend的区别
  7. 项目实战:p2p文件下载器
  8. Linux下的dirent.h在windows下的替换
  9. 编写完了程序,转发一下别人的游戏帖子。。。 没事玩玩游戏。。。。。也不错。
  10. 15.基础实验(4)vga显示图像动态移动