服务与API分离

在开篇前头,我们已经明确过,用户服务用户API的用途与关系,用户服务是基于内网调用不对外暴露的,用户API是暴露到外网提供给外部访问的,用户API的实际用途可以归结为以下几点。

  • 作为用户服务的客户端,提供对外访问路由,提高系统安全性
  • 作为中间层,对web客户端提交信息进行验证过滤
  • 作为中间层,基于限流熔断等机制,控制访问流量。

    初始化项目

    1. mkdir user-api
    2. cd user-api
    3. go mod init github.com/869413421/micro-service/user-api
    4. go get -u github.com/gin-gonic/gin

    编写web服务注册代码

    1. touch main.go
    ``` package main

import ( “github.com/micro/go-micro/v2/web” “log” “time” )

func main() { var serviceName = “micro.api.user” service := web.NewService( web.Name(serviceName), web.Address(“:81”), // 指定服务注册信息在注册中心的有效期。 默认为一分种 web.RegisterTTL(time.Minute2), // 指定服务主动向注册中心报告健康状态的时间间隔,默认为 30 秒。 web.RegisterInterval(time.Minute1), )

  1. err := service.Init()
  2. if err != nil {
  3. log.Fatal("Init api error:", err)
  4. }
  5. err = service.Run()
  6. if err != nil {
  7. log.Fatal("start api error:", err)
  8. return
  9. }

}

  1. 执行`go mod tidy` 下载相关依赖
  2. <a name="mmRqd"></a>
  3. ## 编写dockerfile
  4. :::warning
  5. 因为gin依赖的包和低版本golang有冲突,修改为1.16
  6. :::

touch Dockerfile

  1. ```
  2. # user-api/Dockerfile
  3. # 使用golang官方镜像,并命名为builder
  4. FROM golang:1.16-alpine as builder
  5. # 启用go Modules
  6. ENV GO111MODULE on
  7. # 设置工作目录
  8. WORKDIR /app/micro-user-api
  9. # 将目录中代码拷贝到镜像中
  10. COPY . .
  11. # 下载依赖,
  12. RUN go env -w GOPROXY=https://mirrors.aliyun.com/goproxy,direct && go mod tidy
  13. # 构建二进制文件,添加一些额外参数方便在alpin中运行它
  14. RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o micro-user-api
  15. # 第二阶段构造
  16. FROM alpine:latest
  17. # 更新依赖软件
  18. RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
  19. apk update && \
  20. apk add --no-cache bash ca-certificates &&\
  21. apk add curl
  22. # 和上个阶段一样设置工作目录
  23. RUN mkdir /app
  24. WORKDIR /app
  25. # 这一步不再从宿主机拷贝二进制文件,而是从上一个阶段构建的 builder 容器中拉取
  26. COPY --from=builder /app/micro-user-api/micro-user-api .
  27. # 启动用户API服务
  28. CMD ["./micro-user-api"]

编写makefile

  1. touch Makefile
  1. GOPATH:=$(shell go env GOPATH)
  2. .PHONY: build
  3. build:
  4. CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-w' -i -o micro-user-api ./main.go
  5. .PHONY: test
  6. test:
  7. go test -v ./... -cover
  8. .PHONY: docker
  9. docker:
  10. docker build . -t micro-user-api:latest

执行make build编译二进制文件,方便测试

修改docker-compose.yaml

  1. ...
  2. micro-user-api:
  3. build: ./user-api
  4. depends_on:
  5. - micro-user-service
  6. volumes:
  7. - ./user-api:/app
  8. ports:
  9. - 81:81
  10. environment:
  11. MICRO_REGISTRY: "etcd"
  12. MICRO_REGISTRY_ADDRESS: "etcd1:2379,etcd2:2379,etcd3:2379"
  13. networks:
  14. - micro-network
  15. ...

到项目主目录下执行docker-compose up micro-user-api启动容器

检查服务是否正常启动

image.png
打开http://127.0.0.1:8082/services
image.png
可以看到看到api服务已经注册