Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,经常被用在 Service Mesh 中作为 Sidecar。它具有以下优点:
这部分和 Envoy 关系不大,讲述如何制作 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
修改项目的 pom.xml 添加 Docker 插件。
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
<plugin>
<groupId>com.spotifygroupId>
<artifactId>dockerfile-maven-pluginartifactId>
<version>1.4.10version>
<configuration>
<repository>${project.artifactId}repository>
<contextDirectory>./contextDirectory>
<tag>${project.version}tag>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jarJAR_FILE>
buildArgs>
configuration>
plugin>
plugins>
build>
在项目根目录下(和 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 应用。
启动Docker Quick Start Terminal打开Docker,等待容器启动成功。将目录切换到 SpringBoot 项目的根目录,执行如下命令。
mvn clean package dockerfile:build
命令执行成功之后即生成 Docker 镜像,可以通过 docker images 命令查看。
下面制作一个简单的 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 }}]
编写 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人点赞
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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。