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/

img

本地运行.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 启动的时候查看。

img

通过envoy访问工程.png

可以看到访问成功,我们通过 Envoy 成功访问了 SpringBoot 项目。

0人点赞

Envoy学习笔记

作者:简单一点点
链接:https://www.jianshu.com/p/d9db52330c0f
来源:简书
在 Docker Quick Start Terminal 启动的时候查看。

[外链图片转存中…(img-2pmjBCrF-1630754931931)]

通过envoy访问工程.png

可以看到访问成功,我们通过 Envoy 成功访问了 SpringBoot 项目。

0人点赞

Envoy学习笔记

作者:简单一点点
链接:https://www.jianshu.com/p/d9db52330c0f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐