這次進入微服務的部署,代碼也基本都通過了。如果比做一首歌曲的話,前奏已經結束,現在開始我們的高潮部分,如果吧我們的服務使用docker,使用服務編排工具,把項目給部署運行起來。源碼:https://github.com/limingios/msA-docker
因docker話都是在linux環境,為了方便編寫dockerfile文件,我切換到mac本上進行演示,目的只有一個方便開發sh。方便使用。CICD學習實踐首選電腦還是mac。
服務有個適合的環境,服務可以運行起來,給他準備一個環境,比如服務是個種子,我們需要準備一片土地,服務是一條魚,就需要準備一片大海。源碼中的服務有一個是python寫的,有一個是java寫的,也就是需要2個運行環境,一個基於java,一個基於python。
去http://hub.docker.com 搜索java,找到tag
先配置加速,https://www.daocloud.io/mirror
docker pull java:openjdk-8 docker images|grep jdk
docker run -it --entrypoint bash java:openjdk-8 java -version
熟悉docker的老鐵應該都知道,如果要編譯docker的話需要docker化,首選需要開發dockerfile文件。
文件中不能有寫死的情況,如果寫死了,每次服務的變更都需要變更鏡像。為了減少構建鏡像的過程,盡量吧資料庫的訪問地址,經常會發生變化的東西,需要踢出去,不要在配置文件中配置死,針對資料庫的訪問,不能地址直接寫死,mysql的地址,當服務運行在docker之後,他的ip是實時都在變化的,不能寫死在鏡像里,直接就找不到了就報錯了。還有個問題,我們的服務以什麼樣的形式放在我們docker裡面,springboot之所以說適用於微服務,他有個很大的好處,它可以將咱們的服務構建成一個fat jar,只有一個jar包,然後通過java的一個命令:java -jar 文件.jar 運行起來,這種方式對於微服務來說也是很友好的,也非常的簡單,就使用這種方式來做。變數的方式就可以通過springboot --mysql.address 就可以傳遞進來了。
修改配置文件 和 pom.xml文件
application.properties
service.name=user-thrift-service service.port=7911
#數據源的配置 spring.datasource.url=jdbc:mysql://{mysql.address}:3306/db_user spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" 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"> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> </parent> <modelVersion>4.0.0</modelVersion>
<groupId>com.idig8</groupId> <artifactId>user-thrift-service</artifactId> <version>1.0-SNAPSHOT</version>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.10.0</version> </dependency> <dependency> <groupId>com.idig8</groupId> <artifactId>user-thrift-service-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency>
</dependencies>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
</project>
Dockfile編寫
FROM java:openjdk-8 MAINTAINER liming www.idig8.com
COPY target/user-thrift-service-1.0-SNAPSHOT.jar /user-thrift-service.jar
ENTRYPOINT ["java","-jar","/user-thrift-service.jar"]
執行build生成鏡像
docker build -t user-thrift-service:latest .
查看ip地址
ifconfig
生成容器
docker run -it user-thrift-service:latest --mysql.address=192.168.1.140
新建立build.sh
#!/usr/bin/env bash
mvn package docker build -t user-thrift-service:latest .
後面很多的服務,都依賴它,必須把它做好。它是一個python的服務,我們需要找一個python的鏡像。去官方找吧
docker pull python:3.6 docker images|grep python
編寫Dockerfile
FROM python:3.6 MAINTAINER liming www.idig8.com
RUN pip install thrift
ENV PYTHONPATH / COPY message /message ENTRYPOINT ["python","/message/message_service.py"]
docker build -t message-thrift-python-service:latest .
build開發
鏡像生成容器
docker run -it message-thrift-python-service:latest
微服務的依賴,了解docker的老鐵應該知道可以通過link的方式,去根據名字搜索到這個服務,只要不在開發範圍內的,認為是通過另外的介入方式ip,域名的方式。通過docker分為2種情況,微服務和微服務之間的通信,微服務和外圍系統的通信。修改配置文件 和 pom.xml文件
微服務的依賴,了解docker的老鐵應該知道可以通過link的方式,去根據名字搜索到這個服務,只要不在開發範圍內的,認為是通過另外的介入方式ip,域名的方式。通過docker分為2種情況,微服務和微服務之間的通信,微服務和外圍系統的通信。
server.name=user-edge-service server.port=8082
thrift.user.ip=user-thrift-service thrift.user.port=7911
thrift.message.ip=message-thrift-python-service thrift.message.port=9090
#redis config spring.redis.host=${redis.address} spring.redis.port=6379 spring.redis.password=liming spring.redis.timeout=30000
<groupId>com.idig8</groupId> <artifactId>user-edge-service</artifactId> <version>1.0-SNAPSHOT</version>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.10.0</version> </dependency> <dependency> <groupId>com.idig8</groupId> <artifactId>user-thrift-service-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
<dependency> <groupId>com.idig8</groupId> <artifactId>message-thrift-service-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
Dockerfile編寫
COPY target/user-edge-service-1.0-SNAPSHOT.jar /user-edge-service.jar
ENTRYPOINT ["java","-jar","/user-edge-service.jar"]
build.sh 編寫
mvn package docker build -t user-edge-service:latest .
sh build.sh
創建容器
docker run -it user-edge-service:latest --redis.address=192.168.1.140
#dubbo 配置 spring.dubbo.application.name=course-dubbo-service spring.dubbo.registry.address=zookeeper://${zookeeper.address}:2181 spring.dubbo.protocol.name=dubbo spring.dubbo.protocol.port=20880 #spring.dubbo.protocol.host=127.0.0.1 spring.dubbo.scan=com.idig8.course
#數據源的配置 spring.datasource.url=jdbc:mysql://${mysql.address}:3306/db_course spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
<groupId>com.idig8</groupId> <artifactId>course-dubbo-service</artifactId> <version>1.0-SNAPSHOT</version>
<dependencies> <dependency> <groupId>io.dubbo.springboot</groupId> <artifactId>spring-boot-starter-dubbo</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.10.0</version> </dependency>
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <dependency> <groupId>com.idig8</groupId> <artifactId>course-dubbo-service-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
<dependency> <groupId>com.idig8</groupId> <artifactId>user-thrift-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.idig8</groupId> <artifactId>user-thrift-service-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
COPY target/course-dubbo-service-1.0-SNAPSHOT.jar /course-dubbo-service.jar
ENTRYPOINT ["java","-jar","/course-dubbo-service.jar"]
mvn package docker build -t course-dubbo-service:latest . sh build.sh
docker run -it course-dubbo-service:latest --redis.address=192.168.1.140 --zookeeper.address=192.168.1.140
跟之間的基本是一樣的,都是重複的工作。直接看源碼吧
docker run -it course-edge-service:latest --zookeeper.address=192.168.1.140
docker run -it gataway-zuul:latest
PS:把所有單獨的服務,做成了鏡像,下次想個辦法服務和鏡像統一的運行起來。