精华内容
下载资源
问答
  • dubbo 微服务
    2020-12-19 10:35:19

    将Dubbo微服务迁移到k8s中的思考与落地

    说到容器化,不得不提kubernetes这个集群编排系统,它是一个开源系统,用于容器化应用的自动部署、扩缩和管理。

    Kubernetes 将构成应用的容器按逻辑单位进行分组以便于管理和发现。 Kubernetes 基于自己公司的生产负载上的 15 年经验 打造,并融合了来自社区的最佳建议与实践。在2016年的时候,国外公司亚马逊,IBM这种大型公司,以及国内的阿里巴巴也都在自己原生对k8s进行了支持,近几年来,微服务也是非常的火热,说到微服务用的比较多的像spring cloud,spring boot,以及阿里开源的微服务框架dubbo,很多我们国内的公司也都是采用这种微服务的架构风格,也是由于传统的单体架构带来的一些问题,比如也有的项目有几十万行代码,各个模块之间区别比较模糊,逻辑比较混乱,代码越多复杂性越高,越难解决遇到的问题。

    相信也不是单单这几种问题,选择微服务,也是这种趋势,确实给我们的架构更清晰化,更好去管理更多的服务模块。

    说说微服务为什么更适合容器化?

    Netflix 云架构总监说微服务和 Docker 的结合是一种颠覆。Docker可以为微服务提供一个完美的运行环境。而kubernetes提供了这个集群编排系统,而容器可以轻松实现微服务化后的 DevOps。后面聊dubbo的时候再聊聊为什么微服务和k8s的关系,为什么dubbo更适合部署到k8s中。

    说说Dubbo是什么?

    Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天2000+个服务提供30亿+次访问量的支持,并广泛应用于阿里巴巴集团的个成员站点。也就是一个软件架构,也就是有很多互联网公司都在用这个Dubbo微服务,是一个非常好的微服务治理框架,

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

    简单的说,dubbo就是一个服务框架,如果没有分布式的需求,其实是不需要用的, 只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是 个服务调用的东西,说白了就是个远程服务调用的分布式框架 ,而且dubbo和我们的k8s关系是非常紧密的,好像就是专门为k8s为生的,因为k8s也是一个分布式的基础服务框架,所以我们把dubbo微服务交付到k8s里是非常合适的

    Dubbo能做什么

    • 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。说白了就是dubbo是由消费者和提供者,消费者去消费提供者的方法,就好像调用本地方法一样,配置简单

    • 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 也就是dubbo提供负载均衡机制,比如一个提供者自己启动之后是自动注册的,它是由注册中心帮你调度,按照调度算法帮你调度给后端的提供者,无论你起了多少副本,不用关心是不是在负载均衡器上起的那些副本加上,它自己会加,他会提供这个负载均衡机制,而k8s呢也是这种思路,k8s定义一个service,后端的pod反正都是从这个service这个入口进去,dubbo和k8s设计的方法是不谋而合的。

    • 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名 查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 这个就非常重要了,无论是服务的提供者还是消费者,我们都需要注册中心,你现注册上,然后向外提供服务,找我的时候通过注册中心去找的

    小结:三个最典型的特点

    第一个就是完全透明的本地化调用

    第二点就是负载均衡机制

    第三点就是服务的自动注册与发现

    然后看一下Dubbo的架构图

    ![]

    Provider:暴露服务的服务提供方。 实际上提供者提供了一些过程调用的服务,是基于rpc机制调用方式的,Remote Procedure Call,比如提供一些计算服务,存储服务或者是一些跟数据库连接的一些服务,

    Consumer: 调用远程服务的服务消费方。 主要是提供一些web接口,web页面主要提供一些ui层的一些服务,把后端重的一些服务都放在提供方去,然后调用的话,就是消费者去调用提供方,就好像调用本地方法一样,

    Registry:服务注册与发现的注册中心。

    Monitor: 统计服务的调用次调和调用 时间的监控中心。

    Container: 服务运行容器。

    下面说说具体的架构方案以及实现的方式

    首先k8s环境集群这是首先齐要,一般这个肯定是自己要部署好的,另外就是你需要将你的k8s集群做成一个高可用的一个集群,这样的话,后续你去扩容还有你的环境比如master节点还有一个主控节点帮你去工作,这是首当其要,这里想必很多人也知道,另外要说就是你的pod的持久化,本身你的pod的生命周期就是非常短暂的,你的pod重启或者由于一些特殊的情况的话,那么你的pod的ip那么就会变了,所以这里在这个环境当中大家想必是要去考虑它本身的一个持久话的问题,比如你的jenkins这个要是在k8s中运行的话,那么就需要考虑它的一个工作目录,jenkins_home这个工作目录,也就是jenkins生成的文件,还有你的去拉代码的时候所产生的工作目录都会实地落到你的这个工作目录下的,这个目录你要是在k8s中去部署jenkins,我们就需要将这个工作目录采用这种持久化的这个功能将它共享挂载在我们的其他服务器中的一个目录当中,如果不去做持久化的话,你的工作目录当你的pod重启就会丢失,当然你的容器可能会用到一些维护的相关的命令,要是pod重启你的命令也是会丢失的,或者你想对这个容器做免登录的话,你是需要在你容器中去生成这个ssh-keygen的,这样的话,你容器重启这个目录也是会丢失的,将jenkins部署到k8s中也是可以,但是维护这个容器起来,还是相对来讲,比较麻烦的。

    我们是将我们的jenkins部署到我们的单独一台服务器上。另外我们对jenkins使用的slave架构的方式可以用一台jenkins可以发布测试以及线上的环境。

    部署到单独一台服务器的话,这里我是以这种war包的形式去启动的,这里我为了将我们的jenkins的工作目录进行修改,本身它这个工作目录是放在.jenkins下这个工作目录下的,所以我进行对它这个目录tomcat.catalina.sh的这个目录进行修改添加了export JENKINS_HOME=/opt/k8s/project这个共享目录下,并在你的环境变量中生效,启动你的war包这样的话,你的文件都会落地到这个共享存储中,这是我是使用的这个nfs,这个共享存储去做的这个。

    其他这个共享存储也有很多,像这种的话,比如还有glusterFS,ceph,等等这些都是可以去做的。

    然后接下来就是部署我们的coredns,这个主要也是来完成我们k8s的service的一个域进行解析的,比如我们去安装一个busybox的一个测试工具,可以去测试一下我们集群中的kubernetes.default,一般你的coredns还有你的网络CNI插件没问题的话,是可以正常去解析的,后面就是部署这个elk这个日志文件系统,这个的话,我是将它部署在k8s中的,也是为了方便管理,当然部署在外面也是可以的,我这里是使用的elasticsearch,filebeat,kibana,进行对我们微服务dubbo的项目进行对日志的收集的。

    这里的话,这种pod类型也就是这种亲密性pod,也就是在一个pod中去部署两个容器。

    然后通过这个filebeat在我们的容器中去部署,通过这个采集器去收集我们的日志,然后输出到es中,然后交给kibana来进行对我们dubbo微服务的日志进行输出,这是这一块。

    另外就是我们对于我们的restful接口的一个对外的统一入口,这里我们是通过k8s中的cluster IP 进行发布,通过nginx做反向代理给我们的slb服务均衡器,提供一个公网地址对外统一入口。

    然后就是使用jenkins去将我们的项目发布出去,部署到我们的k8s中,我们这里目前是使用的Jenkins配置自由式发布,每个项目的需求都不一样,我们使用写的脚本去发布的,或者你使用这种pipeline去发布这个也是可以的,因为我们是gitlab的形式去托管代码的,所以我们通过jenkins需要将对gitlab进行免交互登陆,第一在jenkins中ssh-keygen,生成id_rsa id_rsa.pub,一个是私钥一个是公钥,将这个私钥存放着jenkins上的key中,将pub这个公钥放到gitlab中的托管处就可以了, 配置git 执行参数化构建,选择maven,提前将所以的配置都部署好,jdk环境以及maven,放在/etc/profile下并执行好,然后构建执行后,在你项目下的target下面会有这个jar包,或者就是应用程序,我们这里是应用程序,我们将这个应用程序通过写dockerfile的形式将它封装成容器,然后给他一个jre环镜将这个服务部署进去,然后上传到我们的harbor仓库上,再通过k8s的yaml进行去执行,将我们的服务发布出去。

    更多相关内容
  • dubbo微服务

    2017-08-16 15:46:05
    包括dubbo服务提供,dubbo消费者和接口三个项目,对于新手理解和配置dubbo有极好的引导作用
  • 基于springboot的dubbo微服务应用demo,加入了springHttpInvoker接口作为学习测试 api模块为公共实体及服务接口,内有测试用的sql数据脚本 consumer为dubbo服务的消费者及测试 两个provider为不同的dubbo服务...
  • dubbo-service(接口工程,服务定义),dubbo-server(微服务工程,服务注册中心),dubbo-test(WEB工程,服务消费者)
  • dubbo微服务搭建.zip,zookeeper-3.4.12.tar.gz,generatorSqlmapCustom,generatorConfig.xml,src,GeneratorSqlmap.java,com,offcn,pojo,TbUserExample.java,TbMember.java,TbUser.java,TbMemberExample.java,mapper,...
  • 该工程用于测试Dubbo微服务使用Nacos作为注册中心进行RPC调用时发生500异常,异常如下: ...
  • Dubbo 是一个RPC框架,主要提供服务之间的发现注册功能,有关Dubbo相关实现细节不再本...这时候Dubbo的框架就像是一个黑盒子我们很难指导里边发生了什么,这时候就需要我们的监控工具Dubbo-admin。有了这两个之后就可.

    Dubbo 是一个RPC框架,主要提供服务之间的发现注册功能,有关Dubbo相关实现细节不再本片的介绍范围。此文主要介绍如何在本机上搭建一个Dubbo初始的环境。我们知道Dubbo是提供服务之间的注册发现功能,他的注册发现功能是通过注册中心实现的,Dubbo官方推荐的注册中心是Zookper,所以我们先要在本地搭建一个Zookeeper,有了他就可以实现服务之间的注册发现。这时候Dubbo的框架就像是一个黑盒子我们很难指导里边发生了什么,这时候就需要我们的监控工具Dubbo-admin。有了这两个之后就可以通过我们本地的IDE搭建Dubbo的Customer与Provider

    一、搭建Zookeeper

    1、下载适当文件

    Index of /apache/zookeeper/zookeeper-3.6.3 (bfsu.edu.cn)

    在这里插入图片描述
    下载的时候选择tar.gz的,这个是现在完成之后可以直接用的,但是应该是3.5之后我们应该选择带bin的,否则启动的时候会卡死砸死一个地方。现在完成之后进行解压。

    2、更改相关配置文件

    进入conf目录、zoo_sample.cfg,复制一份出来并改名为zoo,zoo_sample.cf就像是系统给我们的一个配置模板
    在这里插入图片描述
    更改端口号与特定目录,data、log的文件
    在这里插入图片描述

    3、启动并测试

    在这里插入图片描述
    第二部出现Welcome to Zookeeper的时候代表Zookeeper成功启动
    在这里插入图片描述

    二、安装Dubbo-admin

    1、下载代码包

    在这里插入图片描述

    2、文件打包

    文件一定是要在解压出来的文件的根目录先打包,在原来打包的时候打在了dubbo-admin-server下面,程序是如何也启动不起来的,但是打包生成的文件却是在dubbo-admin-server的target下的。打包指令:

    mvn clean package -U -Dmaven.test.skip=true

    在这里插入图片描述

    3、启动jar

    在最新的版本中项目dubbo-admin好像是采用了前后端分离,所以打包以及部署的时候可能有所区别。同时按照我们的这个教程打出来的是jar包如果先要达成war包应该下载相应的源码(应该是dubbo的),现在完之后再进行相关的打包操作,当生成war包之后再部署到tomcat中。

    java -jar dubbo-admin-0.2.0-SNAPSHOT_32.jar

    jar包的位置是在:
    在这里插入图片描述

    三、创建Customer与Provider工程

    1、概述

    这里的项目建议创建成父子目录的结构形式,依赖这样这我们做开发与测试的时候方便,不用在多个窗口之间来回切换;再这就是这也是微服务架构下的一个形式。有关父子工程的创建可以参考文章:

    (10条消息) IDEA中创建父子工程(微服务项目框架)_任天柳-CSDN博客

    在这里插入图片描述

    2、项目相关的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">
        <parent>
            <artifactId>dubbo-demo-annotation</artifactId>
            <groupId>com.end</groupId>
            <version>1.0.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.end</groupId>
        <artifactId>dubbo-demo-annotation-provider</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>com.end</groupId>
                <artifactId>dubbo-demo-api</artifactId>
                <version>1.0.0-SNAPSHOT</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>2.7.3</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>2.3.0.RELEASE</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-zookeeper -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-registry-zookeeper</artifactId>
                <version>2.7.3</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-metadata-report-zookeeper -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-metadata-report-zookeeper</artifactId>
                <version>2.7.3</version>
            </dependency>
        </dependencies>
    
    </project>
    

    这里面重要的一个就是引入共同的api依赖,即dubbo-demo-api,在消费者端引入与SpringWeb相关的依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.3.0.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    

    3、Provider配置文件

    dubbo:
      application:
        name: dubbo-annotation-provider
      registry:
        address: zookeeper://127.0.0.1:2181
      protocol:
        name: dubbo
        port: 20881
      metadata-report:
        address: zookeeper://127.0.0.1:2181
    

    4、Customer配置文件

    dubbo:
      application:
        name: dubbo-annotation-consumer
      registry:
        address: zookeeper://127.0.0.1:2181
      protocol:
        name: dubbo
        port: 20882
      metadata-report:
        address: zookeeper://127.0.0.1:2181
    server:
      port: 8089
    

    5、IDEA下的多项目同时运行

    在这里插入图片描述
    在这里插入图片描述
    所有要启动的子项目都需要配置,配置完之后如果不生效的话要记得重启IDEA,完成之后的运行效果为:
    在这里插入图片描述

    展开全文
  • 基于Spring Boot 2.xx + dubbo构建的微服务脚手架(消费模式实现的业务网关) 项目结构 mysise-common ------------公用包部分 mysise-gateway -----------web/api入口 mysise-service -----------dubbo业务服务层 ...
  • dubbo微服务到K8S集群

    千次阅读 2020-06-04 16:25:36
    Dubbo Dubbo是阿里巴巴SOA服务化治理方案的核心框架 Dubbo是一个分布式服务框架,致力于提高性能核透明化的RPC远程服务调用方案,以及SOA服务治理方案 只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,...

    Dubbo

    • Dubbo是阿里巴巴SOA服务化治理方案的核心框架
    • Dubbo是一个分布式服务框架,致力于提高性能核透明化的RPC远程服务调用方案,以及SOA服务治理方案
    • 只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是远程服务调用的分布式框架

    Dubbo能做什么

    • 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入
    • 软负载均衡及容错机制,可在内网代替F5等硬件负载均衡器,降低成本,减少单点
    • 服务自动注册与发现,不再需要写死服务提供地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者

    在这里插入图片描述

    • Provider:暴露服务的服务提供方
    • consumer: 调用远程服务的服务消费方
    • Registry: 服务注册与发现的注册中心
    • Monitor: 统计服务的调用次调和调用时间的监控中心
    • container: 服务运行容器(载体)

    在这里插入图片描述

    zookeeper(zk集群)

    • zookeeper时Dubbo微服务集群的注册中心
    • 它的高可用机制和K8S的etcd集群一致
    • Java编写
    主机名角色ip
    HDSS7-11.host.comk8s代理节点1,zk110.4.7.11
    HDSS7-12.host.comk8s代理节点2,zk210.4.7.12
    HDSS7-21.host.comk8s运算节点1,zk310.4.7.21
    HDSS7-22.host.comk8s运算节点2,jenkins10.4.7.22
    HDSS7-200.host.comk8s运维节点(docker仓库)10.4.7.200

    安装jdk1.8(3台zk角色主机)

    mkdir /usr/java
    tar xf jdk-8u221-linux-x64.tar.gz -C /usr/java/
    ln -s /usr/java/jdk1.8.0_221 /usr/java/jdk
    

    vim /etc/profile

    export JAVA_HOME=/usr/java/jdk
    export PATH=$JAVA_HOME/bin:$JAVA_HOME/bin:$PATH
    export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
    

    安装zookeeper(3台zk角色主机)

    tar xf zookeeper-3.4.14.tar.gz -C /opt/
    ln -s /opt/zookeeper-3.4.14 /opt/zookeeper
    mkdir -pv /data/zookeeper/data /data/zookeeper/logs
    
    

    vim /opt/zookeeper/conf/zoo.cfg

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zookeeper/data
    dataLogDir=/data/zookeeper/logs
    clientPort=2181
    server.1=zk1.od.com:2888:3888
    server.2=zk2.od.com:2888:3888
    server.3=zk3.od.com:2888:3888
    

    注意:各节点zk配置相同

    dns解析

    zk1                A    10.4.7.11
    zk2                A    10.4.7.12
    zk3                A    10.4.7.21
    

    myid

    HDSS7-11.host.com上:

    /data/zookeeper/data/myid

    1
    

    HDSS7-12.host.com上:

    /data/zookeeper/data/myid

    2
    

    HDSS7-21.host.com上:

    /data/zookeeper/data/myid

    3
    

    依次启动zookeeper

    /opt/zookeeper/bin/zkServer.sh start
    

    查看server状态

    /opt/zookeeper/bin/zkServer.sh status
    
    [root@hdss7-11 zookeeper]# /opt/zookeeper/bin/zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: follower
    
    [root@hdss7-12 src]# /opt/zookeeper/bin/zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: leader
    
    [root@hdss7-21 src]# /opt/zookeeper/bin/zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: follower
    

    登录

    /opt/zookeeper/bin/zkCli.sh -server localhost:2181
    

    部署jenkins

    准备基础镜像

    docker pull jenkins/jenkins:2.190.3
    docker tag 22b8b9a84dbe harbor.od.com/public/jenkins:v2.190.3
    docker push harbor.od.com/public/jenkins:v2.190.3
    
    

    生成密钥对

    ssh-keygen -t rsa -b 2048 -C "1226032602@qq.com" -N "" -f /root/.ssh/id_rsa
    

    自定义Dockerfile

    mkdir /data/dockerfile/jenkins/ -p
    

    下载get-docker.sh,准备id_rsa和config.json(在/root/.docker/config.json)

    curl -fsSL get.docker.com -o get-docker.sh 
    

    vim /data/dockerfile/jenkins/Dockerfile

    FROM harbor.od.com/public/jenkins:v2.190.3
    USER root
    RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ 
        echo 'Asia/Shanghai' >/etc/timezone
    ADD id_rsa /root/.ssh/id_rsa
    ADD config.json /root/.docker/config.json
    ADD get-docker.sh /get-docker.sh
    RUN echo "    StrictHostKeyChecking no" >> /etc/ssh/sshd_config &&\
        /get-docker.sh
    
    #指定aliyun镜像
    /get-docker.sh --mirror Aliyun
    
    docker build . -t harbor.od.com/infra/jenkins:v2.190.3
    
    docker push harbor.od.com/infra/jenkins:v2.190.3
    

    创建infra名称空间

    kubectl create namespace infra
    

    创建secret

    kubectl create secret docker-registry harbor --docker-server=harbor.od.com --docker-username=admin --docker-password=Harbor12345 -n infra
    

    准备共享存储

    yum install nfs-utils -y
    
    cat /etc/exports
    /data/nfs-volume 10.4.7.0/24(rw,no_root_squash)
    
    mkdir -p /data/nfs-volume
    systemctl start nfs
    systemctl enable nfs
    

    jenkins资源配置清单

    mkdir /data/k8s-yaml/jenkins && mkdir /data/nfs-volume/jenkins_home && cd /data/k8s-yaml/jenkins
    

    /data/k8s-yaml/jenkins下:
    cat deployment.yaml

    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: jenkins
      namespace: infra
      labels: 
        name: jenkins
    spec:
      replicas: 1
      selector:
        matchLabels: 
          name: jenkins
      template:
        metadata:
          labels: 
            app: jenkins 
            name: jenkins
        spec:
          volumes:
          - name: data
            nfs: 
              server: hdss7-200
              path: /data/nfs-volume/jenkins_home
          - name: docker
            hostPath: 
              path: /run/docker.sock
              type: ''
          containers:
          - name: jenkins
            image: harbor.od.com/infra/jenkins:v2.190.3
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 8080
              protocol: TCP
            env:
            - name: JAVA_OPTS
              value: -Xmx512m -Xms512m
            volumeMounts:
            - name: data
              mountPath: /var/jenkins_home
            - name: docker
              mountPath: /run/docker.sock
          imagePullSecrets:
          - name: harbor
          securityContext: 
            runAsUser: 0
      strategy:
        type: RollingUpdate
        rollingUpdate: 
          maxUnavailable: 1
          maxSurge: 1
      revisionHistoryLimit: 7
      progressDeadlineSeconds: 600
    

    cat svc.yaml

    kind: Service
    apiVersion: v1
    metadata: 
      name: jenkins
      namespace: infra
    spec:
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
      selector:
        app: jenkins
    

    cat ingress.yaml

    kind: Ingress
    apiVersion: extensions/v1beta1
    metadata: 
      name: jenkins
      namespace: infra
    spec:
      rules:
      - host: jenkins.od.com
        http:
          paths:
          - path: /
            backend: 
              serviceName: jenkins
              servicePort: 80
    
    kubectl apply -f http://k8s-yaml.od.com/jenkins/deployment.yaml
    kubectl apply -f http://k8s-yaml.od.com/jenkins/svc.yaml
    kubectl apply -f http://k8s-yaml.od.com/jenkins/ingress.yaml
    

    配置dns解析

    cat /var/named/od.com.zone 
    $ORIGIN od.com.
    $TTL 600	; 10 minutes
    @   		IN SOA	dns.od.com. dnsadmin.od.com. (
    				2020053007 ; serial
    				10800      ; refresh (3 hours)
    				900        ; retry (15 minutes)
    				604800     ; expire (1 week)
    				86400      ; minimum (1 day)
    				)
    				NS   dns.od.com.
    $TTL 60	; 1 minute
    dns                A    10.4.7.11
    harbor             A    10.4.7.200
    k8s-yaml           A    10.4.7.200
    traefik            A    10.4.7.10
    dashboard          A    10.4.7.10
    zk1                A    10.4.7.11
    zk2                A    10.4.7.12
    zk3                A    10.4.7.21
    jenkins            A    10.4.7.10
    

    jenkins登录
    admin
    admin123

    Jenkins配置

    configure global security

    在这里插入图片描述

    在这里插入图片描述

    manager plugin

    安装Blue Ocean插件

    Blue Ocean

    命令行测试Jenkins

    kubectl exec -it -n infra jenkins-54b8469cf9-tllzq -- /bin/bash
    
    whoami
    docker login harbor.od.com
    ssh -i /root/.ssh/id_rsa -T git@gitee.com
    
    java -version
    openjdk version "1.8.0_232"
    OpenJDK Runtime Environment (build 1.8.0_232-b09)
    OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)
    

    安装maven

    HDSS7-200.host.com上

    tar xf apache-maven-3.6.1-bin.tar.gz -C /data/nfs-volume/jenkins_home/
    mv apache-maven-3.6.1 maven-3.6.1-8u232
    

    vim /data/nfs-volume/jenkins_home/maven-3.6.1-8u232/conf/settings.xml

    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
    

    制作dubbo微服务的底包镜像

    docker pull stanleyws/jre8:8u112
    docker tag fa3a085d6ef1  harbor.od.com/public/jre8:8u112
    docker push harbor.od.com/public/jre8:8u112
    

    mkdir /data/dockerfile/jre8
    vim /data/dockerfile/jre8/Dockerfile

    FROM harbor.od.com/public/jre8:8u112
    RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
        echo 'Asia/Shanghai' >/etc/timezone
    ADD config.yml /opt/prom/config.yml
    ADD jmx_javaagent-0.3.1.jar /opt/prom/
    WORKDIR /opt/project_dir
    ADD entrypoint.sh /entrypoint.sh
    CMD ["/entrypoint.sh"]
    

    cat config.yml

    ---
    rules:
      - pattern: '.*'
    

    此jar包收集jvm运行状态

    wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar -O jmx_javaagent-0.3.1.jar
    

    entrypoint脚本
    cat entrypoint.sh

    #!/bin/sh
    M_OPTS="-Duser.timezone=Asia/Shanghai -javaagent:/opt/prom/jmx_javaagent-0.3.1.jar=$(hostname -i):${M_PORT:-"12346"}:/opt/prom/config.yml"
    C_OPTS=${C_OPTS}
    JAR_BALL=${JAR_BALL}
    exec java -jar ${M_OPTS} ${C_OPTS} ${JAR_BALL}
    

    构建镜像

    build . -t harbor.od.com/base/jre8:8u112
    docker push harbor.od.com/base/jre8:8u112
    

    https://gitee.com/stanleywang/dubbo-demo-service

    配置New job

    dubbo-demo
    在这里插入图片描述

    Discard old builds

    • Days to keep builds : 3
    • Max # of builds to keep : 30

    Add Parameter -> String Parameter

    Name : app_name
    Default Value :
    Description : project name. e.g: dubbo-demo-service
    在这里插入图片描述

    Add Parameter -> String Parameter

    Name : image_name
    Default Value :
    Description : project docker image name. e.g: app/dubbo-demo-service
    在这里插入图片描述

    Add Parameter -> String Parameter

    Name : git_repo
    Default Value :
    Description : project git repository. e.g: https://gitee.com/stanleywang/dubbo-demo-service.git
    在这里插入图片描述

    Add Parameter -> String Parameter

    Name : git_ver
    Default Value :
    Description : git commit id of the project.
    在这里插入图片描述

    Add Parameter -> String Parameter

    Name : add_tag
    Default Value :
    Description : project docker image tag, date_timestamp recommended. e.g: 190117_1920
    在这里插入图片描述

    Add Parameter -> String Parameter

    Name : mvn_dir
    Default Value : ./
    Description : project maven directory. e.g: ./
    在这里插入图片描述

    Add Parameter -> String Parameter

    Name : target_dir
    Default Value : ./target
    Description : the relative path of target file such as .jar or .war package. e.g: ./dubbo-server/target
    在这里插入图片描述

    Add Parameter -> String Parameter

    Name : mvn_cmd
    Default Value : mvn clean package -Dmaven.test.skip=true
    Description : maven command. e.g: mvn clean package -e -q -Dmaven.test.skip=true
    在这里插入图片描述

    Add Parameter -> Choice Parameter

    Name : base_image
    Default Value :

    base/jre7:7u80
    base/jre8:8u112
    Description : project base image list in harbor.od.com.
    在这里插入图片描述

    Add Parameter -> Choice Parameter

    Name : maven
    Default Value :

    3.6.0-8u181
    3.2.5-6u025
    2.2.1-6u025
    Description : different maven edition.
    在这里插入图片描述

    Pipeline Script

    pipeline {
      agent any 
        stages {
          stage('pull') { //get project code from repo 
            steps {
              sh "git clone ${params.git_repo} ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.app_name}/${env.BUILD_NUMBER} && git checkout ${params.git_ver}"
            }
          }
          stage('build') { //exec mvn cmd
            steps {
              sh "cd ${params.app_name}/${env.BUILD_NUMBER}  && /var/jenkins_home/maven-${params.maven}/bin/${params.mvn_cmd}"
            }
          }
          stage('package') { //move jar file into project_dir
            steps {
              sh "cd ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.target_dir} && mkdir project_dir && mv *.jar ./project_dir"
            }
          }
          stage('image') { //build image and push to registry
            steps {
              writeFile file: "${params.app_name}/${env.BUILD_NUMBER}/Dockerfile", text: """FROM harbor.od.com/${params.base_image}
    ADD ${params.target_dir}/project_dir /opt/project_dir"""
              sh "cd  ${params.app_name}/${env.BUILD_NUMBER} && docker build -t harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag} . && docker push harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag}"
            }
          }
        }
    }
    

    构建

    Pipeline dubbo-demo
    This build requires parameters:

    app_name
    dubbo-demo-service
    项目名称, 例: dubbo-demo-service

    image_name
    app/dubbo-demo-service
    docker镜像名称,例:app/dubbo-demo-service

    git_repo
    https://gitee.com/stanleywang/dubbo-demo-service
    项目所在的git中央仓库的地址,例如:https://gitee.com/stanleywang/dubbo-demo-service.git

    git_ver
    master
    项目在git中央仓库所对应的项目的分支或版本号

    add_tag
    200605_1708
    docker镜像标签的一部分,日期时间戳, 例如:200605_1630

    mvn_dir
    ./
    编译项目的目录,默认为项目的根目录

    target_dir
    ./dubbo-server/target
    编译完成项目后,产生的jar/war包所在的目录

    mvn_cmd
    mvn clean package -Dmaven.test.skip=true
    执行编译所用的命令

    在这里插入图片描述

    部署

    创建app名称空间

    kubectl create namespace app
    

    创建secret(在app名称空间中),为pull镜像使用

    kubectl create secret docker-registry harbor --docker-server=harbor.od.com --docker-username=admin --docker-password=Harbor12345 -n app
    

    资源清单

    cat deployment.yaml

    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: dubbo-demo-service
      namespace: app
      labels: 
        name: dubbo-demo-service
    spec:
      replicas: 1
      selector:
        matchLabels: 
          name: dubbo-demo-service
      template:
        metadata:
          labels: 
            app: dubbo-demo-service
            name: dubbo-demo-service
        spec:
          containers:
          - name: dubbo-demo-service
            image: harbor.od.com/app/dubbo-demo-service:master_200605_1708
            ports:
            - containerPort: 20880
              protocol: TCP
            env:
            - name: JAR_BALL
              value: dubbo-server.jar
            imagePullPolicy: IfNotPresent
          imagePullSecrets:
          - name: harbor
          restartPolicy: Always
          terminationGracePeriodSeconds: 30
          securityContext: 
            runAsUser: 0
          schedulerName: default-scheduler
      strategy:
        type: RollingUpdate
        rollingUpdate: 
          maxUnavailable: 1
          maxSurge: 1
      revisionHistoryLimit: 7
      progressDeadlineSeconds: 600
    

    部署

    应用之前要确保zookeeper是正常的

    kubectl apply -f http://k8s-yaml.od.com/dubbo-demo-service/deployment.yaml
    

    登录zk查看

    /opt/zookeeper/bin/zkCli.sh -server localhost:2181
    ...省略若干
    
    [zk: localhost:2181(CONNECTED) 0] ls /
    [zookeeper]
    [zk: localhost:2181(CONNECTED) 1] ls /
    [dubbo, zookeeper]
    [zk: localhost:2181(CONNECTED) 2] ls /dubbo
    [com.od.dubbotest.api.HelloService]
    

    在这里插入图片描述

    dubbo-monitor工具

    https://github.com/Jeromefromcn/dubbo-monitor

    HDSS7-200.host.com上:

    unzip dubbo-monitor-master.zip
    mv dubbo-monitor-master dubbo-monitor
    

    修改配置

    vim /opt/src/dubbo-monitor/dubbo-monitor-simple/conf/dubbo_origin.properties

    ##
    # Copyright 1999-2011 Alibaba Group.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    ##
    dubbo.container=log4j,spring,registry,jetty
    dubbo.application.name=dubbo-monitor
    dubbo.application.owner=OldboyEdu
    dubbo.registry.address=zookeeper://zk1.od.com:2181?backup=zk2.od.com:2181,zk3.od.com:2181
    dubbo.protocol.port=20880
    dubbo.jetty.port=8080
    dubbo.jetty.directory=/dubbo-monitor-simple/monitor
    dubbo.charts.directory=/dubbo-monitor-simple/charts
    dubbo.statistics.directory=/dubbo-monitor-simple/statistics
    dubbo.log4j.file=logs/dubbo-monitor-simple.log
    dubbo.log4j.level=WARN
    

    制作镜像

    准备环境

    修改启动脚本
    cat start.sh

    #!/bin/bash
    sed -e "s/{ZOOKEEPER_ADDRESS}/$ZOOKEEPER_ADDRESS/g" /dubbo-monitor-simple/conf/dubbo_origin.properties > /dubbo-monitor-simple/conf/dubbo.properties
    cd `dirname $0`
    BIN_DIR=`pwd`
    cd ..
    DEPLOY_DIR=`pwd`
    CONF_DIR=$DEPLOY_DIR/conf
    
    SERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`
    SERVER_PROTOCOL=`sed '/dubbo.protocol.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`
    SERVER_PORT=`sed '/dubbo.protocol.port/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`
    LOGS_FILE=`sed '/dubbo.log4j.file/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`
    
    if [ -z "$SERVER_NAME" ]; then
        SERVER_NAME=`hostname`
    fi
    
    PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`
    if [ -n "$PIDS" ]; then
        echo "ERROR: The $SERVER_NAME already started!"
        echo "PID: $PIDS"
        exit 1
    fi
    
    if [ -n "$SERVER_PORT" ]; then
        SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`
        if [ $SERVER_PORT_COUNT -gt 0 ]; then
            echo "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"
            exit 1
        fi
    fi
    
    LOGS_DIR=""
    if [ -n "$LOGS_FILE" ]; then
        LOGS_DIR=`dirname $LOGS_FILE`
    else
        LOGS_DIR=$DEPLOY_DIR/logs
    fi
    if [ ! -d $LOGS_DIR ]; then
        mkdir $LOGS_DIR
    fi
    STDOUT_FILE=$LOGS_DIR/stdout.log
    
    LIB_DIR=$DEPLOY_DIR/lib
    LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"`
    
    JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
    JAVA_DEBUG_OPTS=""
    if [ "$1" = "debug" ]; then
        JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
    fi
    JAVA_JMX_OPTS=""
    if [ "$1" = "jmx" ]; then
        JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
    fi
    JAVA_MEM_OPTS=""
    BITS=`java -version 2>&1 | grep -i 64-bit`
    if [ -n "$BITS" ]; then
        JAVA_MEM_OPTS=" -server -Xmx128m -Xms128m -Xmn32m -XX:PermSize=16m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
    else
        JAVA_MEM_OPTS=" -server -Xms128m -Xmx128m -XX:PermSize=16m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
    fi
    
    echo -e "Starting the $SERVER_NAME ...\c"
    exec java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main > $STDOUT_FILE 2>&1
    

    修改以上脚本一个命令

    sed -r -i -e '/^nohup/{p;:a;N;$!ba;d}'  ./dubbo-monitor-simple/bin/start.sh && sed  -r -i -e "s%^nohup(.*)%exec \1%"  ./dubbo-monitor-simple/bin/start.sh
    
    cp -a dubbo-monitor /data/dockerfile/
    cd /data/dockerfile/dubbo-monitor/
    

    cat /data/dockerfile/dubbo-monitor/Dockerfile

    FROM jeromefromcn/docker-alpine-java-bash
    MAINTAINER Jerome Jiang
    COPY dubbo-monitor-simple/ /dubbo-monitor-simple/
    CMD /dubbo-monitor-simple/bin/start.sh
    

    build镜像

    docker build . -t harbor.od.com/infra/dubbo-monitor:latest
    docker push harbor.od.com/infra/dubbo-monitor:latest
    

    解析域名
    cat /var/named/od.com.zone

    $ORIGIN od.com.
    $TTL 600	; 10 minutes
    @   		IN SOA	dns.od.com. dnsadmin.od.com. (
    				2020053008 ; serial
    				10800      ; refresh (3 hours)
    				900        ; retry (15 minutes)
    				604800     ; expire (1 week)
    				86400      ; minimum (1 day)
    				)
    				NS   dns.od.com.
    $TTL 60	; 1 minute
    dns                A    10.4.7.11
    harbor             A    10.4.7.200
    k8s-yaml           A    10.4.7.200
    traefik            A    10.4.7.10
    dashboard          A    10.4.7.10
    zk1                A    10.4.7.11
    zk2                A    10.4.7.12
    zk3                A    10.4.7.21
    jenkins            A    10.4.7.10
    dubbo-monitor      A    10.4.7.10
    

    准备k8s资源配置清单

    mkdir /data/k8s-yaml/dubbo-monitor
    

    vi /data/k8s-yaml/dubbo-monitor/deployment.yaml

    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: dubbo-monitor
      namespace: infra
      labels: 
        name: dubbo-monitor
    spec:
      replicas: 1
      selector:
        matchLabels: 
          name: dubbo-monitor
      template:
        metadata:
          labels: 
            app: dubbo-monitor
            name: dubbo-monitor
        spec:
          containers:
          - name: dubbo-monitor
            image: harbor.od.com/infra/dubbo-monitor:latest
            ports:
            - containerPort: 8080
              protocol: TCP
            - containerPort: 20880
              protocol: TCP
            imagePullPolicy: IfNotPresent
          imagePullSecrets:
          - name: harbor
          restartPolicy: Always
          terminationGracePeriodSeconds: 30
          securityContext: 
            runAsUser: 0
          schedulerName: default-scheduler
      strategy:
        type: RollingUpdate
        rollingUpdate: 
          maxUnavailable: 1
          maxSurge: 1
      revisionHistoryLimit: 7
      progressDeadlineSeconds: 600
    

    vi /data/k8s-yaml/dubbo-monitor/svc.yaml

    kind: Service
    apiVersion: v1
    metadata: 
      name: dubbo-monitor
      namespace: infra
    spec:
      ports:
      - protocol: TCP
        port: 8080
        targetPort: 8080
      selector: 
        app: dubbo-monitor
    

    vi /data/k8s-yaml/dubbo-monitor/ingress.yaml

    kind: Ingress
    apiVersion: extensions/v1beta1
    metadata: 
      name: dubbo-monitor
      namespace: infra
    spec:
      rules:
      - host: dubbo-monitor.od.com
        http:
          paths:
          - path: /
            backend: 
              serviceName: dubbo-monitor
              servicePort: 8080
    

    应用资源配置清单

    kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/deployment.yaml
    kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/svc.yaml
    kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/ingress.yaml
    

    浏览器访问:
    http://dubbo-monitor.od.com/

    dubbo服务消费者(dubbo-demo-consumer)

    app_name
    dubbo-demo-consumer
    项目名称, 例: dubbo-demo-service

    image_name
    app/dubbo-demo-consumer
    docker镜像名称,例:app/dubbo-demo-service

    git_repo
    git@gitee.com:stanleywang/dubbo-demo-web.git
    项目所在的git中央仓库的地址,例如:https://gitee.com/stanleywang/dubbo-demo-service.git

    git_ver
    master
    项目在git中央仓库所对应的项目的分支或版本号

    add_tag
    200606_1131
    docker镜像标签的一部分,日期时间戳, 例如:200605_1630

    mvn_dir
    ./
    编译项目的目录,默认为项目的根目录

    target_dir
    ./dubbo-client/target
    编译完成项目后,产生的jar/war包所在的目录

    mvn_cmd
    mvn clean package -e -q -Dmaven.test.skip=true
    执行编译所用的命令

    在这里插入图片描述

    • Dubbo微服务

      • 注册中心zookeeper(集群)
      • 提供者(集群)
      • 消费者(集群)
      • 监控(dubbo-monitor/dubbo-admin)
    • 在K8S内交付dubbo微服务

      • 有可用的K8S集群
      • 部署zk集群(通常放在K8S集群外,有状态)
      • 部署Jenkins(以容器的形式交付在K8S集群内)
        • root、时区、ssh-key、docker客户端、harbor连接配置
      • 部署maven软件
      • 制作dubbo微服务底包
      • 配置Jenkins持续构建(CI)流水线
      • 使用流水线构建项目,查看harbor仓库
      • 使用资源配置清单,交付项目到K8S集群
    展开全文
  • 1:使用背景 传统单体架构:所有的服务都部署在一台服务器上,如图: 在互联网的发展过程中,在以前,我们只需要一个服务器,将程序全部打包好就可以,但是,随着流量的增大,常规的垂直...Dubbo是一个分布式..

    1:使用背景

    传统单体架构:所有的服务都部署在一台服务器上,如图:

     

    在互联网的发展过程中,在以前,我们只需要一个服务器,将程序全部打包好就可以,但是,随着流量的增大,常规的垂直应用架构已无法应对,所以,架构就发生了演变。

     

    所有的功能都写在一个工程中,规模巨大,不好,更新维护麻烦,项目访问量大时,需要许多服务器,可能访问量大是某些模块的请求多。

    同时对于项目的拓展也有阻力,当项目变更时,所有的服务器都必须要进行变更,矛盾更加的剧烈。

    2:dubbo是什么

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

    RPC是指远程调用,举例:2台服务器A,B,A服务器上的应用想调用B服务器上的方法,由于不再一个内存中,不能直接调用,需要通过网络来表达调用和传递调用的数据。

    简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,

    并且本质上是个服务调用的东西,说白了就是个远程服务调用的分布式框架。

    3:能解决什么问题

    1. 透明化的RPC远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
    2. 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器
    3. 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
    4. 使用 Dubbo 可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。
    5. 分布式架构可以承受更大规模的并发流量。

    4:dubbo的架构

    dubbo架构图如下所示: - 原理图

     

    节点角色说明:

    Provider: 暴露服务的服务提供方。

    Consumer: 调用远程服务的服务消费方。

    Registry: 服务注册与发现的注册中心。

    Monitor: 统计服务的调用次调和调用时间的监控中心。

    Container: 服务运行容器。

    调用关系说明:

    0 服务容器负责启动,加载,运行服务提供者。

    1 服务提供者在启动时,向注册中心注册自己提供的服务。

    2 服务消费者在启动时,向注册中心订阅自己所需的服务。

    3 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

    4 服务消费者,从提供者地址列表中,选一台提供者进行调用,如果调用失败,再选另一台调用。

    5 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    5:具体使用流程

    1:安装zookeeper

    在另外一个文档中有详细的说明,

    注意:zookeeper服务启动之后就不能停掉了,而且要在服务的提供者和消费者之前就启动好注册中心

    2:管理控制台

    在另外一个文档,dubbo-admin

    3:准备项目

    新建一个简单的maven项目进行管理:

    在自己的workspace中新建一个项目,当前项目就是一个总的管理中心,在这个项目中不会写任何的代码,所有的代码都是写在provider中和consumer中。

    所以一般情况下,这个项目只需要是一个简单的maven项目即可,我们也会将当前项目中的src目录进行删除。只会保留最基本的项目架构。

    Provider是服务的提供者, mvc -- model

    Consumer是消息的消费者 mvc - controller

    注意:在启动provider和consumer之前,必须要启动注册中心,这样启动的服务才会在注册中心被注册和发现。

    创建项目来进行管理:

     

    编写父级项目

     

    选择自己的mvn

     

    信息核对

     

    因为这个父项目主要是做管理的,不会有任何代码出现,所以将src直接删掉即可

     

    4:创建公共模块

    将一些提供者和消费都需要使用的内容我们可以存放在公共模块中,比如pojo相关内容和对外暴露的service接口,以及一些工具类的相关内容等。

    这些信息在provider中需要,在consumer中同样是需要的,如果隐藏的话,那么在这些模块中都需要编写,比较麻烦,

    所以直接将这些内容放在公共模块中,这样需要的话直接引入即可。

    右击项目,新建模块(module)

     

    因为module里存放的时pojo和service,因此我们只需要构建普通工程即可

     

     

     

     

     

    5:创建provider

    Provider 是服务的提供者,可以理解为mvc开发模式中的M, 就是从service以后的所有的内容都写在这个项目下。

    模块直接使用springboot的模板创建,因为是一个提供者,所以需要将mybatis相关的内容和数据库相关的内容也一起勾上。

    注意:虽然是provider模块,但是web相关的内容也还是要勾上的。

    点击项目名,然后右击,新建一个模块(module)

     

     

     

     

    6:创建consumer

    和构建提供者provider一样的方式去构建调用者consumer,

    在选择模板的时候,因为只需要和客户端的浏览器进行交互,我们只需要选择一个web即可。

    因为我们的数据都是来源于provider,所以不需要连接数据库的相关内容。

     

     

     

    构建结束后的项目结构如下

     

    到目前为止,咱们就创建好了相关的模块的服务提供者和消费者,同时也抽取了公共的模块内容。接下来就是编写和配置了

    8:编写公共模块

    这里还是以我们熟悉的user为例,在公共模块下新建User类,包名为com.sky.pojo.

    注意:pojo类必须要实现序列化接口

     

    在common工程中的java文件夹下的com.sky.service包下构建接口UserService,内容如下

     

    到这里咱们就完成了公共模块的一些内容的编写,pojo是共用的内容,service接口是对外暴露的服务,实现的细节需要隐藏起来,我们在provider中进行实现。

     

    9:编写配置provider

    1:修改provider的pom文件

    在pom中我们需要引入公共模块的内容,dubbo和zookeeper相关的依赖都需要添加进来

    将下面的内容添加到pom的依赖中:

    <!--        公共模块的引入-->
            <dependency>
                <groupId>com.sky</groupId>
                <artifactId>common</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>

            <!--这是微服dubbo的核心服务包-->
                     <dependency>
                        <groupId>com.alibaba</groupId>
                         <artifactId>dubbo</artifactId>
                         <version>2.5.3</version>
                         <exclusions>
                             <exclusion>
                                 <artifactId>spring</artifactId>
                                 <groupId>org.springframework</groupId>
                             </exclusion>
                         </exclusions>
                     </dependency>
                     <!--这是zookeeper的服务操作包 但主要这里的版本最好和你的zookeeper版本一致-->
                     <dependency>
                         <groupId>org.apache.zookeeper</groupId>
                         <artifactId>zookeeper</artifactId>
                         <version>3.4.6</version>
                         <exclusions>
                            <exclusion>
                                 <artifactId>slf4j-log4j12</artifactId>
                                 <groupId>org.slf4j</groupId>
                             </exclusion>
                         </exclusions>
                     </dependency>
                     <!--这里是zookeeper的zkCli的操作包 我们读写服务全靠这个包-->
                     <dependency>
                         <groupId>com.github.sgroschupf</groupId>
                         <artifactId>zkclient</artifactId>
                         <version>0.1</version>
                     </dependency>

    2:provider代码实现:

    在provider下新建一个service包和mapper包,service包中的UserServiceImpl需要实现公共模块的UserService接口,在mapper包下新建UserMapper接口

    并且在resources下新建mapperxml文件夹,在该文件夹下新建UserMapper.xml

    内容其实和以前是一样的。

     

     

     

    3:配置provider

    编写在provider工程下的resouces文件夹下新建spring-provider.xml,内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                                       http://www.springframework.org/schema/beans/spring-beans.xsd
                                       http://code.alibabatech.com/schema/dubbo
                                       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="userprovider"/>

        <!-- 使用zookeeper注册中心暴露服务地址,我的zookeeper是架在本地的 -->
        <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" timeout="60000"/>

        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880"/>

        <!-- 用户服务接口 -->
        <dubbo:service interface="com.sky.service.UserService" ref="userService"/>
        <bean id="userService" class="com.sky.service.UserServiceImpl"/>

    </beans>

     

    Provider的主启动类如下

    @ImportResource("classpath:spring-provider.xml")
    @MapperScan("com.sky.mapper")
    @SpringBootApplication
    public class UserProviderApplication {

        public static void main(String[] args) {
            SpringApplication.run(UserProviderApplication.class, args);
        }

    }

     

    Yml配置文件如下:

    server:
      port: 8081

    spring:
      datasource:
        username: root
        password: root
        url: jdbc:mysql://localhost:3306/kj03?useUnicode=true&characterEncoding=utf-8
        driver-class-name: com.mysql.jdbc.Driver

    mybatis:
      mapper-locations: classpath:mapperxml/*.xml
      config-location: classpath:mybtaisConfig.xml

     

    把之前的mybatis的配置文件引入进来即可。

    到这里我们的provider已经配置编写好了

    此时,可以启动我们的provider,然后在dubbo-admin中进行查看该服务释放以及注册到了zookeeper中。

    10:编写配置consumer

    1:修改POM文件和代码编写

    在consumer中其实就是写之前的controller的相关内容。在编写代码之前,需要在consumer的POM中引入公共的模块,同时还要引入dubbo和zookeeper相关的依赖。

    在consumer项目下新建com.sky.controller.UserController, 并且在里面完成对应方法的编写和映射。

    因为后面我们得服务器主要都是提供数据的,所以直接使用restController注解即可。

     

    2:核心配置文件配置

    在consumer的核心配置文件中我们仅仅就是换了一下端口号,其他的暂时没有做变更。

    # consumer的配置文件
      server.port=9090

     

    3:配置consumer

    和provider类似的是,consumer也是需要一个dubbo的配置文件,需要在consumer项目下的resources文件夹下新建一个spring-consumer.xml的文件,

    具体配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
             <beans xmlns="http://www.springframework.org/schema/beans"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
                    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                    http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

                 <dubbo:application name="user-consumer"/>
                 <dubbo:registry check="false" address="zookeeper://127.0.0.1:2181"/>
                 <dubbo:reference interface="com.sky.service.UserService" id="userService"/>
             </beans>

     

    Consumer的主启动类如下, 需要引入我们后加入的配置文件

    @ImportResource("classpath:spring-consumer.xml")
    @SpringBootApplication
    public class UserConsumerApplication {

        public static void main(String[] args) {
            SpringApplication.run(UserConsumerApplication.class, args);
        }

    }

     

    11:微服务的测试

    1:启动zookeeper服务端

    注意:启动的时候是有顺序的

    第一件事就是先启动我们的注册中心

     

    出现下图则说明成功了,黑窗口不能关闭!!!!!切记:不能关闭

     

    2:启动dubbo-admin

    进入到dubbo-admin的源码目录,在target目录下有之前生成好的一个jar文件,

    通过 java -jar jarName的方式可以启动dubbo-admin服务,然后访问localhost:7001即可实现登录查看我们的服务

     

     

     

     

    3:启动服务的提供者

    服务的提供者就是我们之前写的provider,启动方式就是通过主启动的方式启动

    注意:必须要先启动provider

     

    启动后通过dubbo-admin可以在提供者的列表中查看到当前的服务

     

    点击可以查看详情:

     

    4:启动消费者consumer

    消费者的启动和提供者的启动方式是一样的,其实就是启动应用!注意端口号的修改,启动完成之后我们就可以看到有2个服务在启动了。

     

    完成后,打开dubbo-admin

     

     

    5:打开浏览器获取postman进行测试

    此时我们需要访问服务的消费者中提供的请求映射,有数据返回,说明我们的微服务架构搭建已经完成了。

     

    到此,一个springboot + dubbo + mybatis 的微服务架构就已经搭建完成了,很简单

    如要源码和资料的同学可以关注微信公众号:六点半编程, 回复资料即可获得。

    公众号中有很多技术的选型,架构师的必备技能,以及一些设计模式的文章

    扫码关注:

     

     

     

     

     

     

    展开全文
  • 在盘古开发框架下实现将微服务发布为 HTTP 接口有两种方式。一种是基于 pangu-web 模块的接口调用模式;一种是基于 ShenYu 网关的泛化调用模式。
  • Dubbo微服务架构下的Kubernetes云平台建设实践.docx
  • dubbo微服务优雅停机

    2021-05-13 20:25:52
     注意点 dubbo优雅停机,只会关心dubbo管理的线程池,也就是说只会等待dubbo的线程,线程名是DubboServerHandler,不会等待进程中的其他线程。假如有非dubbo线程在执行业务,并且希望它能执行完。那么就要采用其他...
  • 1.视频是我自己花了一天的功夫录制,目的是让大家能从项目架构设计、搭建、模块拆分到测试整个流程的熟悉。 2.基于19年比较新的jar包,包含项目代码 3.框架设计层次清晰,命名按照实际的项目经验规范。
  • 公司简介信用算力,国内领先的信用服务解决方案提供商。以技术为驱动,依托人工智能、大数据、云计算等核心科技,为金融交易、交通出行、就业招聘等多个产业场景合作方提供
  • 2018年度最新阿里Dubbo微服务-某谷全套视频教程,全套让你走进国产微服务的世界
  • 实现Spring整合Redis Sentinel实现缓存高可用,整合dubbo、zookeeper实现微服务高可用源码。
  • NULL 博文链接:https://jackyin5918.iteye.com/blog/2405459
  • 只要去编辑maven脚本即 这只是演示,然后把安装的jdk删除 下一步交付Dubbo微服务提供者和消费者,需要准备一个底包,找到一个合适 运行时环境底包 debian系列的底包 把镜像pull下来 也可以run 这个sh的时候指定源是...
  • 该套餐包含dubbo课程和springboot课程。
  • 该套餐包含两门课程,dubbo课程和springcloud课程。
  • dubbo具备了server注册,发现、路由、负载均衡的功能,在所有实现了这些功能的服务治理组件中,个人觉得dubbo还是略微笨重了,因为它本身是按照j2EE范畴所制定的中规中矩的服务治理框架。 dubbo在服务发现这个地方...
  • 一、了解Dubbo二、架构部署1. 部署zk集群2、部署jenkins 一、了解Dubbo 理解dubbo架构: zk为有状态服务,所以适合放在集群外部 二、架构部署 实验环境: 三台master,两台worker [root@master01 ~]# kubectl ...
  • Dubbo微服务实战购票平台(一) - 简介

    千次阅读 2019-08-20 23:45:25
    Dubbo可以按需集成其他组件,完成微服务生态环境构建 2 业务架构 3 核心功能 4 知识点 5 技术架构 6 环境 jdk8 64位、Maven 3.0.5、MySQL mysql-5.7.23 Openresty-1.13.6.1、Tomcat 8、Dubbo 2.6...
  • 如何搭建Spring Boot+Dubbo微服务

    千次阅读 2019-01-06 17:31:15
    记录一下这周末搭建dubbo的过程。 公司一直使用的是dubbo框架,但是自己却一直停留在了使用的地位上,不知道如何搭建一个dubbo项目。 首先瞄下下dubbo的结构,多分一点可以分为3个模块;一个模块是common,这里面...
  • Dubbo实现微服务调用

    2022-09-01 21:13:35
    前面介绍了微服务的概述和部署,本文将开始介绍通过Dubbo实现微服务间的调用。
  • 转载于:https://my.oschina.net/u/3451156/blog/887209
  • Dubbo微服务打成可执行jar包

    千次阅读 2016-01-28 00:51:49
    1.配置pom.xml,遇到了很多问题... dubbo-service ${project.build.directory}/classes src/main/resources true **/*.xml **/*.properties
  • dubbo微服务框架的搭建过程``1.项目建立及依赖包配置2.如何分析页面的请求和参数并实现商品的展示以及商品类型的展示3.完成了商品的类型,商品添加,编辑,上架,下架4.配置反向代理5.现了对商品添加功能的进一步...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,743
精华内容 24,297
关键字:

dubbo 微服务