.NetCore+Envoy+Id4+Dapr+EFCore 构建微服务之Envoy
.NetCore比较流行的微服务应该时是用Ocelot的方式构建微服务,纯配置化,开发量也比较小。但是做过一些项目之后发现这个方式不是很适合,首先它比较笨重,其次不支持gRpc和webSocket通信,最重要是它只适用于.NetCore,如果设计到其他语言如Java和Go就歇菜了。
终于曙光来了,随着Dapr的诞生,微软在开源的基础上有迈出了重要的一步,有人要问了,什么是Dapr,这个后续章节我会着重介绍,简单来说就是可以跨语言协同开发微服务。今天我们介绍一下一个轻量级的网关服务:Envoy,它是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,体积小,性能高。Envoy
是一个独立进程,设计为伴随每个应用程序服务运行。所有的 Envoy
形成一个透明的通信网格,每个应用程序发送消息到本地主机或从本地主机接收消息,不需要知道网络拓扑,对服务的实现语言也完全无感知,这种模式也被称为 Sidecar
。记住它的以下特点:
L3/L4/L7 架构
顶级 HTTP/2 支持
服务发现和动态配置
gRPC 支持
特殊协议支持
可观测性
好了 废话不多说,我们来看下如何构建一个Envoy网关。
如上图所示:大概分了四大块,我也有备注
admin:域,定义网关的本身的地址和端口,日志信息等
static_resources:静态资源,定义监听服务端口,路由,过滤规则等
clusters:集群,服务发现,转发,健康检查,熔断等
rate_limit_service:限流服务,这个是独立的grpc服务,属于外挂服务,目前有go的demo
完整配置如下:
- admin:
- access_log_path: /tmp/admin_access.log
- address:
- # 本地配置
- socket_address:
- protocol: TCP
- address: 0.0.0.0
- port_value: 4001
- static_resources:
- listeners:
- # 监听端口
- - name: listener_0
- address:
- socket_address:
- protocol: TCP
- address: 0.0.0.0
- port_value: 4050
- filter_chains:
- #网关过滤规则
- - filters:
- - name: envoy.filters.network.http_connection_manager
- typed_config:
- "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
- stat_prefix: ingress_http
- codec_type: AUTO
- route_config:
- name: local_route
- # 路由配置
- virtual_hosts:
- - name: local_service
- domains: ["*"]
- routes:
- - name: service_a
- match:
- # 访问后缀
- prefix: "/ap0/"
- route:
- # 重写后缀
- prefix_rewrite: "/speak/"
- # 服务映射
- cluster: city_service
- http_filters:
- - name: envoy.filters.http.router
- # 服务集群
- clusters:
- - name: service_a
- connect_timeout: 0.25s
- type: static
- lb_policy: round_robin
- # 负载均衡服务集群
- hosts:
- - socket_address:
- address: 127.0.0.1
- port_value: 5041
- - socket_address:
- address: 127.0.0.1
- port_value: 5042
- # 被动动健康检查
- outlier_detection:
- consecutive_5xx: 2
- base_ejection_time: 40s
- max_ejection_percent: 40
- interval: 20s
- success_rate_minimum_hosts: 3
- success_rate_request_volume: 10
- # 主动健康检查
- health_checks:
- - timeout: 1s
- interval: 10s
- interval_jitter: 1s
- unhealthy_threshold: 6
- healthy_threshold: 1
- http_health_check:
- path: "/health"
- rate_limit_service:
- grpc_service:
- envoy_grpc:
- cluster_name: rate_limit_cluster
- timeout: 0.25s
说明
可以看出来: 1.监听的是4050端口,
2.设置了一个路由service_a,访问Url:/ap0/ 重写成 /speak/,
3.服务集群配置了两个服务:127.0.0.1:5041,127.0.0.1:5042,从而轻易的实现了负载均衡,默认轮询模式。
4.设置被动健康检查:outlier_detection,重现2次5xx访问之后,主动掉线服务,并且主动检查掉线服务,成功 success_rate_minimum_hosts: 3 次之后重新上线服务
5.health_checks,主动健康检查,10秒一次主动检查集群服务,连续6次失败之后,主动掉线服务,保证服务高可用。
部署:
Envoy采用的是Docker部署。下一节介绍如何启动Envoy网关服务
.NetCore+Envoy+Id4+Dapr+EFCore 构建微服务之Envoy的更多相关文章
- 技术分享:Dapr,让开发人员更轻松地构建微服务应用
最近一直在学习微服务相关的技术.微服务架构已成为构建云原生应用程序的标准,并且可以预见,到2022年,将有90%的新应用程序采用微服务架构.微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合 ...
- 通过silky框架在.net平台构建微服务应用
目录 必要前提 使用Web主机构建微服务应用 使用.NET通用主机构建微服务应用 构建具有websocket服务能力的微服务应用 构建Silky微服务网关 开源地址 在线文档 在线示例 必要前提 (必 ...
- 使用silky脚手架构建微服务应用
目录 模板简介 构建独立应用的模板Silky.App.Template 构建模块化应用的模板Silky.Module.Template 开源地址 在线文档 模板简介 使用 dotnet new 命令可 ...
- [译]Spring构建微服务
此文为译文,原文地址 介绍 本文通过一个使用Spring.Spring Boot和Spring Cloud的小例子来说明如何构建微服务系统. 我们可以通过数个微服务组合成一个大型系统. 我们可以想象下 ...
- 构建微服务:Spring boot
构建微服务:Spring boot 在上篇文章构建微服务:Spring boot 提高篇中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jp ...
- 如何使用 Java 构建微服务?
[编者按]微服务背后的大理念是将大型.复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化.本文主要介绍了利用 Java 生态系统构建微服务的多种方法,并分析了每种方法的利弊 ...
- 构建微服务-使用OAuth 2.0保护API接口
微服务操作模型 基于Spring Cloud和Netflix OSS 构建微服务-Part 1 基于Spring Cloud和Netflix OSS构建微服务,Part 2 在本文中,我们将使用OAu ...
- 基于Spring Cloud和Netflix OSS构建微服务,Part 2
在上一篇文章中,我们已使用Spring Cloud和Netflix OSS中的核心组件,如Eureka.Ribbon和Zuul,部分实现了操作模型(operations model),允许单独部署的微 ...
- 构建微服务(Building Microservices)-PDF 文档
闲时翻译了几篇基于Spring Cloud.Netflix OSS 构建微服务的英文文章,为方便分享交流,整理为PDF文档. PDF 文档目录: 目录 一.微服务操作模型... 3 1. 前提 ...
随机推荐
- 精尽Spring Boot源码分析 - 剖析 @SpringBootApplication 注解
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 17、linux root用户密码找回
17.1.救援模式: 光盘模式启动(第一启动项) 删除/mnt/sysimage/etc/passwd root的密码,halt重启. 改为硬盘启动模式,无密码进入root,为root新建密码 17. ...
- ACM金牌选手整理的【LeetCode刷题顺序】
算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...
- SpringCloud:扩展zuul配置路由访问
继续上次整合SpringCloud的demo进行扩展zuul:https://www.cnblogs.com/nhdlb/p/12555968.html 这里我把zuul划分出一个模块单独启动 创建 ...
- 什么是 Acunetix 目标知识库
随着Acunetix 的最新更新,我们引入了一个称为目标知识库的新功能.每次扫描目标时,Acunetix 都会收集并存储有关它的信息.此信息包括构成站点结构的路径.表单的位置及其输入.Web 应用程序 ...
- Spring boot中相关的注解
一.相关类中使用的注解 @RestController:REST风格的控制器 @RequestMapping:配置URL和方法之间的映射 @SpringBootApplication:应用程序入口类 ...
- mongodb oplog详解和格式分析
1. 基本概念 oplog使用固定大小集合记录了数据库中所有修改操作的操作日志(新增.修改和删除,无查询),mongodb收到修改请求后,先在主节点(Primary)执行请求,再把操作日志保存到opl ...
- Ubuntu中Docker的安装与使用
Ubuntu中安装Docker 更新ubuntu的apt源索引 sudo apt-get update 2.安装包允许apt通过HTTPS使用仓库 sudo apt-get install \ apt ...
- Java中的基本数据类型和引用数据类型的区别
一.数据类型 Java中的数据类型分为两大类,基本数据类型和引用数据类型. 1.基本数据类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long.int.short.byte ②浮点类型:fl ...
- 在R中使用Keras和TensorFlow构建深度学习模型
一.以TensorFlow为后端的Keras框架安装 #首先在ubuntu16.04中运行以下代码 sudo apt-get install libcurl4-openssl-dev libssl-d ...