k8s入坑之路(13)服務遷移(定時任務 微服務 傳統服務)


 

定時任務遷移kubernetes

服務遷移步驟

 

1.安裝好java

2.安裝好maven

  • 項目打包
    mvn package

     

  • 測試傳參運行
    java -cp cronjob-demo-1.0-SNAPSHOT.jar com.mooc.demo.cronjob。Main

     

  • 編輯Dockfile
    FROM 172.17.166.172/kubenetes/openjdk:8-jre-alpine
    
    COPY target/cronjob-demo-1.0-SNAPSHOT.jar /cronjob-demo.jar
    
    
    ENTRYPOINT ["java", "-cp", "/cronjob-demo.jar", "com.mooc.demo.cronjob.Main" ]

     

  • 打包並運行測試鏡像
    docker build -t cronjob-demo:v1 .
    docker run -it cronjob-demo:v1

     

  • 修改鏡像tag並上傳
    docker tag cronjob-demo:v1 172.17.166.17/kuberneres/cronjob-demo:v1
    
    docker push 172.17.166.17/kuberneres/cronjob-demo:v1

     

  • 制作k8s部署文件
    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: cronjob-demo
    spec:
      schedule: "*/1 * * * *"  #分時日月周
      successfulJobsHistoryLimit: 3 #成功任務歷史保存個數
      suspend: false    #是否停止 如果是true cronjob並不會調度起來
      concurrencyPolicy: Forbid #並行策略
      failedJobsHistoryLimit: 1 #失敗保存個數
      jobTemplate:
        spec:
          template:
            metadata:
              labels:
                app: cronjob-demo
            spec:
              restartPolicy: Never #重啟策略 
              containers:
              - name: cronjob-demo
                image: 172.17.166.172/kubenetes/cronjob:v1

     

  • 查看任務
    kubectl apply -f conjob-demo.yaml
    kubectl get cronjob

     

【不熟悉SpringBoot的筒子看過來】SpringBoot快速入門

 

 簡介

SpringBoot使你可以非常容易的創建一個獨立的、生產級的、基於spring的應用。
它大量簡化了使用spring帶來的繁瑣的配置,大部分基於SpringBoot的應用只需要一點點的配置。

特征

  • 獨立的spring應用(內置tomcat、jetty,無需部署war包)
  • 提供了豐富的"starter"依賴,簡化應用構建配置
  • 自動配置spring和第三方依賴庫
  • 沒有代碼生成,沒有xml配置
  • 提供准生產功能,如指標,健康檢查和外部配置

Quick Start

生成項目

訪問官網:https://start.spring.io/
選擇構建工具,如:Maven Project、Java、Spring Boot 版本 2.1.4 以及一些基本信息,如下圖:

 

最終會下載到一個demo.zip,解壓后主要目錄結構如下

├── demo
│   ├── pom.xml
│   └── src
│       └── main
│           ├── java
│           │   └── com
│           │       └── example
│           │           └── demo
│           │               └── DemoApplication.java
│           └── resources
│               └── application.properties

在demo基礎上做一個web服務

改造后的pom
<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>
View Code
服務配置 - application.properties
# 服務名
server.name=springboot-web-demo
# web服務監聽端口
server.port=8080
增加controller代碼

com.example.demo.DemoController.java

package com.example.demo;

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

@RestController
public class DemoController {

    @RequestMapping("/hello")
    public String sayHello() {
        return "Hello SpringBoot";
    }

}
運行&測試

經過以上步驟,一個基於springboot的web服務就搭建好了。

運行方式如下:

  • 在IDE中:
    直接以DemoApplication做為啟動類。
  • 在命令行下:
# 構建fatjar(構建結果在target目錄下)
$ cd demo
$ mvn clean package

# 運行jar包
$ java -jar target/demo-0.0.1-SNAPSHOT.jar

測試:
打開瀏覽器訪問: http://localhost:8080/hello 看看效果吧

 

springboot的web服務遷移kubernetes

  • 打包
    mvn package

     

  • Dockerfile編寫
    FROM 172.17.166.172/kubenetes/openjdk:8-jre-alpine
    
    COPY target/springboot-web-demo-1.0-SNAPSHOT.jar /web-demo.jar
    
    
    ENTRYPOINT ["java" , "-jar" , "/web-demo.jar"]

     

  • build鏡像 測試並上傳鏡像
    jar -tf springboot-web-demo-1.0-SNAPSHOT.jar #查看jar包中包含的內容

    java -jar springboot-web-demo-1.0-SNAPSHOT.jar #測試包運行是否正常
    docker build -t springboot-web-demo:v1 . 

    docker run -it springboot-web-demo:v1

    docker tag springboot-web-demo:v1 172.17.166.217/kubernetes/springboot-web-demo:v1

    docker push springboot-web-demo:v1 172.17.166.217/kubernetes/springboot-web-demo:v1

     

  • 編輯k8s部署文件並運行
    #deploy
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-demo
    spec:
      selector:
        matchLabels:
          app: springboot-web-demo
      replicas: 2
      template:
        metadata:
          labels:
            app: springboot-web-demo
        spec:
          containers:
          - name: springboot-web-demo
            image: 172.17.166.217/kubenetes/web:v1
            ports:
            - containerPort: 8080
    ---
    #service
    apiVersion: v1
    kind: Service
    metadata:
      name: springboot-web-demo
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: springboot-web-demo
      type: ClusterIP
    
    ---
    #ingress
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: springboot-web-demo
    spec:
      rules:
      - host: www.cssp.com
        http:
          paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: springboot-web-demo
                port:
                  number: 80
    spring-web-demo.yaml
    kubectl apply -f spring-web-demo.yaml
    
    kubectl get deploy spring-web-demo
    
    kubectl get pod -l app.kubernetes.io/name=spring-web-demo

     

Dubbo快速入門

簡介

Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。

Dubbo源自阿里巴巴,2018年初貢獻給了apache基金會。已經經歷兩年多的孵化。
據悉,2.7.x會作為Dubbo在Apache社區的畢業版本,Dubbo將有機會成為繼RocketMQ后,來自阿里巴巴的又一個Apache頂級項目(TLP)。

架構

dubbo主要有三種角色:

  • 服務的提供者
    啟動后會把服務的信息寫入注冊中心(服務的ip地址,端口,有哪些接口等)
  • 服務消費者
    訪問注冊中心找到服務提供者的信息,並跟服務提供者建立連接。
  • 注冊中心
    主要作用是存儲服務的信息,並對服務的變化做通知。

 

Quick Start

最常見的使用dubbo的方式是基於spring框架。下面的內容也是基於spring框架的配置去演示如何開發一個基於dubbo的應用。

首先我們創建一個根目錄叫:dubbo-demo:

$ mkdir dubbo-demo
$ cd dubbo-demo

然后在根目錄下創建三個子目錄:

  • dubbo-demo-api: 服務的api定義
  • dubbo-demo-provider: 服務提供者
  • dubbo-demo-consumer: 服務消費者

1. 注冊中心 - zookeeper

dubbo常用的注冊中心是zookeeper,首先用docker啟動一個zookeeper服務,暴露出2181端口。

docker run -idt -p 2181:2181 zookeeper:3.5

2. dubbo-demo-api - 服務接口定義

定義服務接口(DemoService.java)

package org.apache.dubbo.demo;

public interface DemoService {
    String sayHello(String name);
}

此時工程的結構應該類似這樣:

├── dubbo-demo-api
│   ├── pom.xml
│   └── src
│       └── main
│           └── java
│               └── org
│                   └── apache
│                       └── dubbo
│                           └── demo
│                               └── DemoService.java

3. dubbo-demo-provider - 服務提供者

服務實現類(DemoServiceImpl.java)
package org.apache.dubbo.demo.provider;
import org.apache.dubbo.demo.DemoService;

public class DemoServiceImpl implements DemoService {
    public String sayHello(String name) {
        return "Hello " + name;
    }
}
服務啟動類(Provider.java)
package org.apache.dubbo.demo.provider;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Provider {

    public static void main(String[] args) throws Exception {
        System.setProperty("java.net.preferIPv4Stack", "true");
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"});
        context.start();
        System.out.println("Provider started.");
        System.in.read(); // press any key to exit
    }
}
通過spring配置暴露服務(provider.xml)
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 服務提供者的應用名 -->
    <dubbo:application name="demo-provider"/>
    <!-- 把服務注冊到zookeeper -->
    <dubbo:registry address="zookeeper://${zookeeper_ip_addr}:2181"/>
    <!-- 使用dubbo協議暴露服務端口20880 -->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!-- 服務的實現類 -->
    <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
    <!-- 聲明要暴露的服務接口 -->
    <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>
</beans>
配置日志(log4j.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <param name="encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] {%p} %c %L - %m%n" />
        </layout>
    </appender>
    <root>
        <level value="warn" />
        <appender-ref ref="stdout" />
    </root>
</log4j:configuration>
最終項目結構如下
├── dubbo-demo-provider
│   ├── pom.xml
│   └── src
│       └── main
│           ├── java
│           │   └── org
│           │       └── apache
│           │           └── dubbo
│           │               └── demo
│           │                   └── provider
│           │                       ├── DemoServiceImpl.java
│           │                       └── Provider.java
│           └── resources
│               ├── META-INF
│               │   └── spring
│               │       └── dubbo-demo-provider.xml
│               └── log4j.xml

4. dubbo-demo-consumer - 服務消費者

用下面的spring配置引用一個遠程的dubbo服務(consumer.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 消費者應用名 -->
    <dubbo:application name="demo-consumer"/>
    <!-- 用zookeeper發現服務 -->
    <dubbo:registry address="zookeeper://${zookeeper_ip_addr}:2181"/>
    <!-- 生成遠程服務的代理, 之后demoService就可以像使用本地接口一樣使用了 -->
    <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/>
</beans>
消費者啟動類(Consumer.java)
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.apache.dubbo.demo.DemoService;
 
public class Consumer {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"META-INF/spring/dubbo-demo-consumer.xml"});
        context.start();
        // Obtaining a remote service proxy
        DemoService demoService = (DemoService)context.getBean("demoService");
        // Executing remote methods
        String hello = demoService.sayHello("world");
        // Display the call result
        System.out.println(hello);
    }
}
配置好日志后(同provider),項目結構如下:
├── dubbo-demo-consumer
│   ├── pom.xml
│   └── src
│       └── main
│           ├── java
│           │   └── org
│           │       └── apache
│           │           └── dubbo
│           │               └── demo
│           │                   └── consumer
│           │                       └── Consumer.java
│           └── resources
│               ├── META-INF
│               │   └── spring
│               │       └── dubbo-demo-consumer.xml
│               └── log4j.xml

5. 完整示例

  • provider
$ git clone https://github.com/apache/incubator-dubbo.git
$ cd incubator-dubbo
在模塊dubbo-demo-provider下運行org.apache.dubbo.demo.provider.Provider
如果用的IDE是Intellij Idea,需要添加參數:-Djava.net.preferIPv4Stack=true
  • consumer
$ git clone https://github.com/apache/incubator-dubbo.git
$ cd incubator-dubbo
如果用的IDE是Intellij Idea,需要添加參數:-Djava.net.preferIPv4Stack=true

 

傳統dubbo服務遷移kubernetes

  •  打包

    mvn install #進入dubbo api目錄安裝dubbo api
    
    mvn package #打包
    
    tar -tf dubbo-demo-1.0-SNPASHOT-assembly.tar.gz 查看包中包含具體資源

     

  • 測試
    /bin/start.sh 啟動服務
    
    查看接口是否開放 進程是否存在
    telnet ip dubbo端口連接
    
    ls 查看服務
    
    ls com.mooc.demo.api.DemoService 查看有哪些服務接口
    
    invoke com.mooc.demo.api.DemoService.sayHello("Dick")調用接口
    
    /bin/stop.sh 測試停止服務

     

  • 制作dockerfile並測試
    FROM hub.mooc.com/kubernetes/openjdk:8-jre-alpine
    
    COPY target/ROOT /ROOT
    
    ENTRYPOINT ["sh", "/ROOT/bin/start.sh"]

     

  • dubbo服務發現

 

1.provider向zookeeper注冊,zookeeper返回給consumer容器ip

2.如整體架構都在k8s中則無問題,如consumer在集群之外。

3.provider可將真實宿主機ip通過文件掛載方式configmap掛載到provider evn中。注冊時使用真實ip。缺點(性能消耗不好,使用不方便)

4.provider可使用宿主機網絡,hostnetwork。直接與宿主機共用網絡。缺點端口會增多混亂所以要規划好端口使用問題。

5.優雅退出dubbo優雅退出是系統向程序發送一個SIGTERM信號kill 15終止信號,出發代碼run中方法去執行下線流程。kubelet關閉容器默認也是發送SIGTERM kill 15信號與微服務契合。有可能遇到Pod卡死,處理不了優雅退出的命令或者操作、優雅退出的邏輯有BUG,陷入死循環、代碼問題,導致執行的命令沒有效果。所以可以在prostop中加入腳本向注冊中心通知下線操作。

 

  • k8s部署文件
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dubb-demo
    spec:
      selector:
        matchLabels:
          app: dubb-demo
      replicas: 1
      template:
        metadata:
          labels:
            app: dubb-demo
        spec:
          hostNetwork: true
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - dubb-demo
                topologyKey: "kubernetes.io/hostname"
          containers:
          - name: dubb-demo
            image: hub.mooc.com/kubernetes/dubbo:v1
            ports:
            - containerPort: 20881
            env:
            - name: DUBBO_PORT
              value: "20881" #在啟動文件中替換端口
    dubbo.yaml

     

傳統web服務遷移kubernetes

  • 打包測試
    mvn package

     

  • 構建dockerfile 
    FROM 172.17.166.217/kubenetes/tomcat:8.0.51-alpine
    
    COPY ROOT /usr/local/tomcat/webapps/ROOT
    
    COPY dockerfiles/start.sh /usr/local/tomcat/bin/start.sh
    
    ENTRYPOINT ["sh" , "/usr/local/tomcat/bin/start.sh"]
    tomcat.yaml

     

  • 鏡像測試后將鏡像上傳庫並制作k8s文件
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-demo
    spec:
      selector:
        matchLabels:
          app: web-demo
      replicas: 4
      template:
        metadata:
          labels:
            app: web-demo
        spec:
          containers:
          - name: web-demo
            image: hub.mooc.com/kubernetes/web:v1
            ports:
            - containerPort: 8080
    tomcat.yaml

    ###注默認tomcat啟動是后台運行,容器收不到存活進程會自動退出,要在啟動文件中編輯一個循環指令。類似於

    #!/bin/bash
    
    sh /usr/local/tomcat/bin/startup.sh
    
    tail -f /usr/local/tomcat/logs/catalina.out

     

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM