Docker下的Nacos环境开发,mysql联合索引原理

基础镜像,使用alpine操作系统,openjkd使用8u201

FROM openjdk:8u201-jdk-alpine3.9

#作者

MAINTAINER BolingCavalry [email protected]

#系统编码

ENV LANG=C.UTF-8 LC_ALL=C.UTF-8

#path

ENV PATH /opt/conda/bin:$PATH

#安装必要的软件

#RUN apt-get update --fix-missing && apt-get install -y wget

RUN apk update && apk add wget

#下载下来的压缩文件名称

ENV NACOS_FILE_NAME nacos-server-1.1.0.tar.gz

#把启动时用到的文件准备好

COPY ./docker-entrypoint.sh /docker-entrypoint.sh

#解压后的文件夹名称

ENV NACOS_FOLDER_NAME nacos

RUN wget https://github.com/alibaba/nacos/releases/download/1.1.0/nacos-server-1.1.0.tar.gz -O ~/$NACOS_FILE_NAME && \

tar -zxf ~/$NACOS_FILE_NAME -C ~/ && \

rm ~/$NACOS_FILE_NAME && \

chmod a+x /docker-entrypoint.sh

ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 8848

从Dockerfile内容中可见,先去nacos的github下载安装包,然后解压,再复制docker-entrypoint.sh到镜像中,最后将nacos的8848端口暴露出来;

再来看看docker-entrypoint.sh文件的内容,该文件在容器启动时会被执行,内容很简单,就是进入nacos的bin目录,执行启动文件,再将start.out输出到控制台:

#!/bin/sh

echo "Starting nacos"n && \

cd ~/nacos/bin && \

./startup.sh -m standalone && \

cd …/logs && \

tail -f start.out

有两个重要信息需要注意:

  1. nacos的官方参考启动命令是./startup.sh -m standalone,这个命令会将jvm的输出重定向到start.out文件,也就是说nacos的JVM进程是在后台运行的,不会占用控制台(相比之下,spring boot应用使用java -jar启动时会占用控制台),对于docker来说,容器内的进程如果不占用控制台,docker就认为该容器已经结束工作,就会停止该容器,所以,为了避免nacos在docker刚刚启动就退出,需要用tail -f start.out来占领控制台;

  2. 用tail -f start.out来占领控制台可以避免容器刚刚启动就退出,但也有个弊端,就是容器中有了多个进程,并且nacos进程的PID不是1,所以在执行docker stop命令时,结束进程的信号量不会到nacos进程,而是去了PID等于1的进程,所以nacos进程不会立即退出,只能等到30秒后被强制kill,这个问题最好的解法是修改nacos的startup.sh,让nacos进程始终保持在控制台,不要重定向到后台,但这样就导致Dockerfile不好处理了,每次下载和解压了nacos安装包后,都要用本地的startup.sh去替换原有的,这样做的话,如果nacos升级版本,这边本地的startup.sh也要随之更新,很是麻烦…

[](

)构建镜像

  1. Dockerfile和docker-entrypoint.sh文件准备好之后放在同一个目录,执行以下命令构建镜像:

docker build -t bolingcavalry/nacossimpleprovider:1.0-SNAPSHOT

  1. 如果您在hub.docker.com已经注册,可以执行以下命令将本地镜像上传到 hub.docker.com ,这样任何人都可以下载使用该镜像了:

docker push bolingcavalry/nacossimpleprovider:1.0-SNAPSHOT

Nacos镜像的制作已经完成,接下来制作一个java应用的镜像:服务提供者;

[](

)java应用的父工程

接下来要开发的simple-provider和simple-consumer两个应用都是java应用,为了管理方便,做一个基于maven的父工程,再将simple-provider和simple-consumer以module的形式加入到这个父工程中;

  1. 基于maven创建父工程,名为nacosdemo,其pom.xml内容如下:

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

simpleconsumer

simpleprovider

org.springframework.boot

spring-boot-starter-parent

2.0.5.RELEASE

com.bolingcavalry

nacosdemo

pom

1.0-SNAPSHOT

1.8

UTF-8

UTF-8

1.8

2.0.5.RELEASE

Finchley.SR1

0.2.2.RELEASE

org.springframework

【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

.cloud

spring-cloud-dependencies

${spring.cloud.version}

pom

import

org.springframework.cloud

spring-cloud-alibaba-dependencies

${spring.cloud.alibaba.version}

pom

import

org.apache.maven.plugins

maven-compiler-plugin

${java.version}

${java.version}

${project.build.sourceEncoding}

可见这是个普通的父工程,里面对spring cloud和spring cloud alibaba的版本做了控制,避免子工程还要各种指定版本的繁琐操作;

[](

)制作服务提供者镜像

simple-provider是个java web应用,使用了spring cloud alibaba的依赖库之后可以使用Nacos的注册发现服务,整个工程的开发步骤如下:

  1. 基于maven创建工程,其pom.xml内容如下:

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

nacosdemo

com.bolingcavalry

1.0-SNAPSHOT

4.0.0

simpleprovider

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-alibaba-nacos-discovery

org.springframework.boot

spring-boot-maven-plugin

com.google.cloud.tools

jib-maven-plugin

1.3.0

openjdk:8u201-jdk-alpine3.9

bolingcavalry/nacos p r o j e c t . a r t i f a c t I d : {project.artifactId}: project.artifactId:{project.version}

-Xms1g

-Xmx1g

上述内容有两点需要注意:

a. 依赖spring-cloud-starter-alibaba-nacos-discovery,这样可以用上spring cloud nacos的服务;

b. 使用了maven插件jib-maven-plugin,用于将应用构建成docker镜像,此插件相关的详情请参考[《Docker与Jib(maven插件版)实战》](

);

2. 配置文件application.properties,配置应用名称和nacos地址,注意这里nacos地址配置的是nacoshost,对应的是后面docker-compose.yml中的link参数:

spring.application.name=simple-provider

spring.cloud.nacos.discovery.server-addr=nacoshost:8848

  1. 应用启动类SimpleProviderApplication ,配置了注解EnableDiscoveryClient,用于启动注册发现服务:

package simpleprovider;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient

@SpringBootApplication

public class SimpleProviderApplication {

public static void main(String[] args) {

SpringApplication.run(SimpleProviderApplication.class, args);

}

}

  1. 增加一个提供http服务的controller类ProviderController:

package simpleprovider.controller;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;

import java.util.Date;

/**

  • @Description: 提供web服务的controller

  • @author: willzhao E-mail: [email protected]

  • @date: 2019/7/28 11:08

*/

@RestController

public class ProviderController {

@RequestMapping(value = “/hello/{name}”, method = RequestMethod.GET)

public String hello(@PathVariable(“name”) String name){

return "hello " + name + ", " + new SimpleDateFormat(“yyyy-mm-dd HH:mm:ss”).format(new Date());

}

}

  1. 以上就是simple-provider的所有源码了,在pom.xml所在目录执行以下命令,即可构建docker镜像,存入本地仓库:

mvn compile jib:dockerBuild

[](

)制作服务消费者镜像

simple-consumer是个java web应用,启动后对外提供http服务,响应的时候,通过nacos取得simple-provider的地址,然后向simple-provider发请求,将响应返回给浏览器:

  1. 基于maven创建工程,其pom.xml内容如下:

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

nacosdemo

com.bolingcavalry

1.0-SNAPSHOT

4.0.0

simpleconsumer

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-alibaba-nacos-discovery

你可能感兴趣的:(程序员,面试,java,后端)