Envoy 简介
Envoy 简介Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,经常被用在 Service Mesh 中作为 Sidecar。它具有以下优点:非侵入的架构:Envoy 是和应用服务并行运行的,透明地代理应用服务发出/接收的流量。应用服务只需要和 Envoy 通信,无需知道其他微服务应用在哪里。基于 Modern C++11实现,性能优异。L3/L4 过滤器架构:
Envoy 简介
Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,经常被用在 Service Mesh 中作为 Sidecar。它具有以下优点:
- 非侵入的架构:Envoy 是和应用服务并行运行的,透明地代理应用服务发出/接收的流量。应用服务只需要和 Envoy 通信,无需知道其他微服务应用在哪里。
- 基于 Modern C++11实现,性能优异。
- L3/L4 过滤器架构:Envoy 的核心是一个 L3/L4 代理,然后通过插件式的过滤器(network filters)链条来执行 TCP/UDP 的相关任务,例如 TCP 转发,TLS 认证等工作。
- HTTP L7 过滤器架构:HTTP在现代应用体系里是地位非常特殊的应用层协议,所以 Envoy 内置了一个非常核心的过滤器: http_connection_manager。http_connection_manager 本身是如此特殊和复杂,支持丰富的配置,以及本身也是过滤器架构,可以通过一系列 http 过滤器(http filters)来实现 http协议层面的任务,例如:http路由,重定向,CORS支持等等。
- HTTP/2 作为第一公民:Envoy 支持 HTTP/1.1 和 HTTP/2,推荐使用 HTTP/2。
- gRPC 支持:因为对 HTTP/2 的良好支持,Envoy 可以方便的支持 gRPC,特别是在负载和代理上。
- 服务发现: 支持包括 DNS, EDS 在内的多种服务发现方案。
- 健康检查:内置健康检查子系统。
- 高级的负载均衡方案:除了一般的负载均衡,Envoy 还支持基于 rate limit 服务的多种高级负载均衡方案,包括: automatic retries, circuit breaking, global rate limiting
- Tracing:方便集成 Open Tracing 系统,追踪请求
- 统计与监控:内置 stats 模块,方便集成诸如 prometheus/statsd 等监控方案
- 动态配置:通过“动态配置API”实现配置的动态调整,而无需重启 Envoy 服务的。
制作 SpringBoot 镜像
这部分和 Envoy 关系不大,讲述如何制作 SpringBoot 镜像,已经会的小伙伴可以直接跳过。
创建 SpringBoot 应用
创建一个 SpringBoot Web应用。
package com.wyk.envoydemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class EnvoydemoApplication {
public static void main(String[] args) {
SpringApplication.run(EnvoydemoApplication.class, args);
}
}
在项目中添加一个简单的 Web 页面。
package com.wyk.envoydemo.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Hello, You can access me by Envoy.";
}
}
本地运行,查看程序是否有问题。正常应该可以通过浏览器访问 http://localhost:8080/ 。
本地运行.png
添加 Docker 插件
修改项目的 pom.xml 添加 Docker 插件。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--Docker插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.10</version>
<configuration>
<repository>${project.artifactId}</repository>
<contextDirectory>./</contextDirectory>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
添加 Dockerfile
在项目根目录下(和 pom.xml 同级)创建文件 Dockerfile 并添加如下内容。
# 基础镜像
FROM openjdk:8-jdk-alpine
# 对应pom.xml文件中的dockerfile-maven-plugin插件buildArgs配置项JAR_FILE的值
ARG JAR_FILE
# 复制打包完成后的jar文件到/opt目录下
COPY ${JAR_FILE} /opt/app.jar
# 启动容器时执行
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/opt/app.jar"]
# 使用端口8080
EXPOSE 8080
文件的大致含义为:本镜像基于openjdk:8-jdk-alpine镜像创建,然后获取 pom.xml 中的 JAR_FILE 参数,即生成的 jar 包文件名),并将该jar包拷贝至/opt/app.jar,然后在容器启动时执行 java 命令启动 jar 包。最后暴露8080端口,用于访 SpringBoot 应用。
生成 SpringBoot 镜像
启动Docker Quick Start Terminal打开Docker,等待容器启动成功。将目录切换到 SpringBoot 项目的根目录,执行如下命令。
mvn clean package dockerfile:build
命令执行成功之后即生成 Docker 镜像,可以通过 docker images 命令查看。
制作 Envoy 镜像
下面制作一个简单的 Envoy 镜像。
编写配置文件
编写 envoy-config.yaml文件,内容如下。
# 对管理日志及端口进行简单配置,用于接收管理消息的端口为9999
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 127.0.0.1, port_value: 9999 }
# 定义静态资源
static_resources:
listeners:
# 配置一个接收流量的监听器,接收客户发送的请求
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 10000 }
filter_chains:
- filters:
# 定义一个过滤器用于转发流量
- name: envoy.http_connection_manager
config:
stat_prefix: ingress_http
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: local_service
# 不绑定域名
domains: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: some_service }
http_filters:
- name: envoy.router
clusters:
- name: some_service
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
# 配置后端挂载的IP地址
hosts: [{ socket_address: { address: 127.0.0.1, port_value: 8080 }}]
生成 Envoy 镜像
编写 Dockerfile 添加如下内容。
FROM envoyproxy/envoy-alpine:latest
COPY envoy-config.yaml /etc/envoy/envoy.yaml
文件的含义是根据 envoyproxy/envoy-alpine 镜像创建新镜像,并将配置文件复制到指定位置。
然后运行如下命令生成镜像。
docker build -t envoytest:v1.0.0 .
注意最后的点,代表当前目录,即 envoy-config.yaml 和 Dockerfile 所在的目录。
启动镜像生成容器
首先启动 envoy 容器,执行如下命令。
docker run -p 10000:10000 --name envoytest envoytest:v1.0.0
envoy 监听在10000端口,同时该端口也在宿主机的10000端口上暴露出来。当有请求到达监听上后,envoy 会对所有请求路由到 some_service 这个 cluster 上,而该cluster的upstream 指向本地的 8080 端口,也就是 SpringBoot 服务上。
然后启动 SpringBoot 容器,并让该容器使用和 Envoy 容器同样的网络。
docker run -d --network=container:envoytest --name envoydemo envoydemo:1.0-SNAPSHOT
启动成功后,在本地的浏览器上访问 Docker 虚拟机的 10000 端口,Docker 虚拟机的 IP 可以在 Docker Quick Start Terminal 启动的时候查看。
通过envoy访问工程.png
可以看到访问成功,我们通过 Envoy 成功访问了 SpringBoot 项目。
0人点赞
作者:简单一点点
链接:https://www.jianshu.com/p/d9db52330c0f
来源:简书
在 Docker Quick Start Terminal 启动的时候查看。
[外链图片转存中…(img-2pmjBCrF-1630754931931)]
通过envoy访问工程.png
可以看到访问成功,我们通过 Envoy 成功访问了 SpringBoot 项目。
0人点赞
作者:简单一点点
链接:https://www.jianshu.com/p/d9db52330c0f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
更多推荐
所有评论(0)