架构图
bookinfo 原始架构为四个微服务,Pdoduct Page 访问 3个不同版本的 Reviews 和 Details,Reviews 访问 Ratings
运行到 Istio 环境,每个服务注入 Envoy sidecars 后 服务之间访问通过 Sidecar 访问
远程访问
Reviews微服务使用 Java 中 javax.ws.rs.client.Client 访问 Ratings ,如果没有配置系统环境变量,则直接k8s中服务名访问,即: http://ratings:9080/ratings 进行访问
private final static String services_domain = System.getenv("SERVICES_DOMAIN") == null ? "" : ("." + System.getenv("SERVICES_DOMAIN"));
private final static String ratings_hostname = System.getenv("RATINGS_HOSTNAME") == null ? "ratings" : System.getenv("RATINGS_HOSTNAME");
private final static String ratings_service = "http://" + ratings_hostname + services_domain + ":9080/ratings";
Product page 微服务使用 Python 远程访问 ,使用 k8s 中 service 名称进行远程访问
servicesDomain = "" if (os.environ.get("SERVICES_DOMAIN") is None) else "." + os.environ.get("SERVICES_DOMAIN")
detailsHostname = "details" if (os.environ.get("DETAILS_HOSTNAME") is None) else os.environ.get("DETAILS_HOSTNAME")
ratingsHostname = "ratings" if (os.environ.get("RATINGS_HOSTNAME") is None) else os.environ.get("RATINGS_HOSTNAME")
reviewsHostname = "reviews" if (os.environ.get("REVIEWS_HOSTNAME") is None) else os.environ.get("REVIEWS_HOSTNAME")
flood_factor = 0 if (os.environ.get("FLOOD_FACTOR") is None) else int(os.environ.get("FLOOD_FACTOR"))
details = {
"name": "http://{0}{1}:9080".format(detailsHostname, servicesDomain),
"endpoint": "details",
"children": []
}
接入层网关
使用ingressgateway,为应用部署接入层网关
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
Mysql 数据库
Mysql 镜像
FROM mysql:8.0.20
# MYSQL_ROOT_PASSWORD must be supplied as an env var
COPY ./mysqldb-init.sql /docker-entrypoint-initdb.d
镜像中执行的默认 SQL 语句
# Initialize a mysql db with a 'test' db and be able test productpage with it.
# mysql -h 127.0.0.1 -ppassword < mysqldb-init.sql
CREATE DATABASE test;
USE test;
CREATE TABLE `ratings` (
`ReviewID` INT NOT NULL,
`Rating` INT,
PRIMARY KEY (`ReviewID`)
);
INSERT INTO ratings (ReviewID, Rating) VALUES (1, 5);
INSERT INTO ratings (ReviewID, Rating) VALUES (2, 4);
同样 Mongodb 中也进行了初始化
FROM mongo:4.0.19-xenial
WORKDIR /app/data/
COPY ratings_data.json /app/data/
COPY script.sh /docker-entrypoint-initdb.d/
RUN chmod +x /docker-entrypoint-initdb.d/script.sh