文章目录

Dubbo管理控制台

1、Dubbo管理控制台的主要作用:

服务治理

2、管理控制台主要包含:

路由规则

动态配置

服务降级

访问控制

权重调整 负载均衡等管理功能

3、管理控制台版本:

当前稳定版:dubbo-admin-2.5.3.war (可到Q群367211134 共享文件下载)

最新2.5.4-SNAPSHOT版下载地址: https://github.com/alibaba/dubbo

安装 Dubbo 管理控制台

Dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费者进行管理,但

管控台是否正常对 Dubbo 服务没有影响,管控台也不需要高可用,因此可以单节点部署。

IP: 192.168.3.71

部署容器:apache-tomcat-7.0.57

端口:8080

1、 下载最新版的 Tomcat7:

$wget
http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57 .tar.gz

2、 解压:

$ tar -zxvf apache-tomcat-7.0.57.tar.gz
$ mv apache-tomcat-7.0.57 dubbo-admin-tomcat

3、 移除/home/wusc/dubbo-admin-tomcat/webapps 目录下的所有文件:

 $ rm -rf *

4、 上传 Dubbo 管理控制台程序 dubbo-admin-2.5.3.war 到/home/wusc/dubbo-admin-tomcat/webapps

5、 解压并把目录命名为 ROOT:

$ unzip dubbo-admin-2.5.3.war -d ROOT

把 dubbo-admin-2.5.3.war 移到/home/wusc/tools 目录备份

 $ mv dubbo-admin-2.5.3.war /home/wusc/tools

6、 配置 dubbo.properties(在ROOT/WEB-INF/):

$ vi ROOT/WEB-INF/dubbo.properties
dubbo.registry.address=zookeeper://192.168.3.71:2181
dubbo.admin.root.password=wusc.123//root用户的密码是wusc.123
dubbo.admin.guest.password=wusc.123//guest用户的密码是wusc.123

(以上密码在正式上生产前要修改)

7、 防火墙开启 8080 端口,用 root 用户修改/etc/sysconfig/iptables

 # vi /etc/sysconfig/iptables

增加:

## dubbo-admin-tomcat:8080
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

重启防火墙:

# service iptables restart

8、 启动 Tomat7

$ /home/wusc/dubbo-admin-tomcat/bin/startup.sh

9、 浏览 http://192.168.3.71:8080/

会要求输入用户名密码



10、 配置部署了 Dubbo 管控台的 Tomcat 开机启动: 在虚拟主机中编辑/etc/rc.local 文件,加入:

su - wusc -c '/home/wusc/dubbo-admin-tomcat/bin/startup.sh'

验证:

启动provider和consumer,Dubbo管理控制台==》服务治理==》应用

使用Maven构建Dubbo服务的可执行jar包

Dubbo服务的运行方式:

1、使用Servlet容器运行(Tomcat、Jetty等)----不可取

将provider做成web工程,在web.xml中配置

<web-app>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring/spring-context.xml</param-value>
	</context-param>
</web-app>

然后通过tomcat启动即可

缺点:增加复杂性(端口、管理)、浪费资源(内存)

服务器容器是一个standalone的启动程序,因为后台服务不需要tomcat或jboss等web容器的功能,如果硬要用wen容器去加载服务提供方,增加复杂性(需要多个端口,还需要配置,内存调优),也浪费资源(tomcat也占用内存)。

2、自建Main方法类来运行(Spring容器) ----不建议(本地调试可用)

自己写一个测试类来加载spring文件

package dubbo.test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 *
 * @描述: 启动Dubbo服务用的MainClass.
 * @作者: WuShuicheng .
 * @创建时间: 2013-11-5,下午9:47:55 .
 * @版本: 1.0 .
 */
public class DubboProvider {

	private static final Log log = LogFactory.getLog(DubboProvider.class);

	public static void main(String[] args) {
		try {
			ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml");
			context.start();
		} catch (Exception e) {
			log.error("== DubboProvider context start error:",e);
		}
		synchronized (DubboProvider.class) {
			while (true) {
				try {
					DubboProvider.class.wait();
				} catch (InterruptedException e) {
					log.error("== synchronized error:",e);
				}
			}
		}
	}

}

缺点: Dobbo本身提供的高级特性没用上、自已编写启动类可能会有缺陷

3、使用Dubbo框架提供的Main方法类来运行(Spring容器)----建议使用

优点:框架本身提供(com.alibaba.dubbo.container.Main)、可实现优雅关机(ShutdownHook)

优雅关机:

dubbo是通过jdk的ShutdownH噢OK未完成优雅停机的,所以如果用户使用kill -9 PID等强制关闭指令,是不会执行优雅停机的,只有通过kill PId,才会执行。

原理

  • 服务提供方:

    停止时,先标记为不接受新请求,心情求过来时直接报错,让客户端重试其他机器。

    然后,检测线程池中的线程是否正常运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。
  • 服务消费方:

    停止时,不在发起新的调用请求,所有新的调用在客户端即报错。

    然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。

注意点:

spring-context.xml

<import resource="classpath:spring/spring-xxx.xml" />

//为什么有这一步?

//dubbo官方文档中说:如果用到com.alibaba.dubbo.container.Main这个类启动的话,

//会自动加载META-INF/spring目录下的所有的spring配置,如何配置?

//配置在java命令-D参数或者dubbo.properties中

// dubbo.spring.config-classpath*:META-INF/spring/*.xml====》配置spring配置加载位置

maven配置文件

provider==>pom.xml

build节点

//项目构建项目的时候用的
<build>
		//构建的项目名
		<finalName>edu-service-user</finalName>
		<resources>
		//将resource下的所有配置文件构建进来
			<resource>
				<targetPath>${project.build.directory}/classes</targetPath>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
				<includes>
					<include>**/*.xml</include>
					<include>**/*.properties</include>
				</includes>
			</resource>
			<!-- 结合com.alibaba.dubbo.container.Main -->
			//为什么有这一步?
			//dubbo官方文档中说:如果用到com.alibaba.dubbo.container.Main这个类启动的话,
			//会自动加载META-INF/spring目录下的所有的spring配置,如何配置?
			//配置在java命令-D参数或者dubbo.properties中
			// dubbo.spring.config-classpath*:META-INF/spring/*.xml====》配置spring配置加载位置

			//因为我们项目中spring的配置文件是在src/main/resources/spring下的
			//所以这里的作用就是把这些配置文件在加载的时候放在
			//${project.build.directory}/classes/META-INF/spring目录下
			<resource>
				<targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
				<directory>src/main/resources/spring</directory>
				<filtering>true</filtering>
				<includes>
					<include>spring-context.xml</include>
				</includes>
			</resource>
		</resources>
		//插件管理
		<pluginManagement>
			<plugins>
				<!-- 解决Maven插件在Eclipse内执行了一系列的生命周期引起冲突 -->
				<plugin>
					<groupId>org.eclipse.m2e</groupId>
					<artifactId>lifecycle-mapping</artifactId>
					<version>1.0.0</version>
					<configuration>
						<lifecycleMappingMetadata>
							<pluginExecutions>
								<pluginExecution>
									<pluginExecutionFilter>
										<groupId>org.apache.maven.plugins</groupId>
										<artifactId>maven-dependency-plugin</artifactId>
										<versionRange>[2.0,)</versionRange>
										<goals>
											<goal>copy-dependencies</goal>
										</goals>
									</pluginExecutionFilter>
									<action>
										<ignore />
									</action>
								</pluginExecution>
							</pluginExecutions>
						</lifecycleMappingMetadata>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
		<plugins>
			<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					//把target/classes/下所有的文件拷贝到jar包里面去
					<classesDirectory>target/classes/</classesDirectory>
					<archive>
					//可执行jar包的main类
						<manifest>
							<mainClass>com.alibaba.dubbo.container.Main</mainClass>
							<!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
							//这里是因为maven每打一个版本会有一个时间戳,
							//一个奇怪的问题是,下载下来的版本不是一个带时间戳的版本,
							//就会出现有些程序和类包引用不到
							<useUniqueVersions>false</useUniqueVersions>
							//依赖的路径
							<addClasspath>true</addClasspath>
							//把项目需要的jar包方法lib目录中去
							//项目依赖的路径是lib
							<classpathPrefix>lib/</classpathPrefix>
						</manifest>
						<manifestEntries>
							<Class-Path>.</Class-Path>
						</manifestEntries>
					</archive>
				</configuration>
			</plugin>
			//把服务的jar包指向${project.build.directory}/lib
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>copy-dependencies</id>
						<phase>package</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
						<configuration>
							<type>jar</type>
							<includeTypes>jar</includeTypes>
							<useUniqueVersions>false</useUniqueVersions>
							<outputDirectory>
								${project.build.directory}/lib
							</outputDirectory>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>

	</build>

dependence节点

<dependencies>
//注意这里面的四个是项目依赖的其他项目,虽然都在eclipse里面,但是
//maven找的时候是去repository中去拿
//所以应该先去构建,否则会报错
//对其他项目执行  mvn install 命令

		<dependency>
			<groupId>wusc.edu.common</groupId>
			<artifactId>edu-common</artifactId>
			<version>${edu-common.version}</version>
		</dependency>

		<dependency>
			<groupId>wusc.edu.common</groupId>
			<artifactId>edu-common-config</artifactId>
			<version>${edu-common-config.version}</version>
		</dependency>

		<dependency>
			<groupId>wusc.edu.common</groupId>
			<artifactId>edu-common-core</artifactId>
			<version>${edu-common-core.version}</version>
		</dependency>

		<dependency>
			<groupId>wusc.edu.facade</groupId>
			<artifactId>edu-facade-user</artifactId>
			<version>${edu-facade-user.version}</version>
		</dependency>

				<!-- Common Dependency Begin -->
		<dependency>
			<groupId>antlr</groupId>
			<artifactId>antlr</artifactId>
		</dependency>
		<dependency>
			<groupId>aopalliance</groupId>
			<artifactId>aopalliance</artifactId>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
		</dependency>
		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib</artifactId>
		</dependency>
		<dependency>
			<groupId>net.sf.json-lib</groupId>
			<artifactId>json-lib</artifactId>
			<classifier>jdk15</classifier>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>ognl</groupId>
			<artifactId>ognl</artifactId>
		</dependency>
		<dependency>
			<groupId>oro</groupId>
			<artifactId>oro</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-digester</groupId>
			<artifactId>commons-digester</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-validator</groupId>
			<artifactId>commons-validator</artifactId>
		</dependency>
		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
		</dependency>
		<dependency>
			<groupId>net.sf.ezmorph</groupId>
			<artifactId>ezmorph</artifactId>
		</dependency>
		<dependency>
			<groupId>javassist</groupId>
			<artifactId>javassist</artifactId>
		</dependency>
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
		</dependency>
		<dependency>
			<groupId>javax.transaction</groupId>
			<artifactId>jta</artifactId>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
		</dependency>

		<!-- Common Dependency End -->

		<!-- Spring Dependency Begin -->
		//此处省略spring的依赖
		<!-- Spring Dependency End -->

		<!-- MyBatis Dependency Begin -->
		//此处省略MyBaties的依赖
		<!-- MyBatis Dependency End -->

		<!-- Struts2 Dependency Begin -->
		//此处省略Struts2的依赖
		<!-- Struts2 Dependency End -->

		<!-- Others Begin -->
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>servlet-api</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>jsp-api</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
		</dependency>
		<dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
		</dependency>
		<!-- Others End -->

		<!-- Mysql Driver Begin -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- Mysql Driver End -->

		<!-- dubbo 需要的jar start -->
		<dependency>
			<groupId>org.jboss.netty</groupId>
			<artifactId>netty</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
		</dependency>

		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
		</dependency>
		<!-- dubbo 需要的jar end -->

	</dependencies>

打包

mvn  clean package

最后java -jar启动即可。

在Linux上部署Dubbo服务

1、环境变量配置 Java环境变量----只需要JRE

vi /etc/profile

## java env
export JAVA_HOME=/usr/local/java/jdk1.7.0_72
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/li/tools.jar:$JRE_HOME/lib/rt.jar export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

source /etc/profile

2、部署目录规范



要避免应用迁移时的路径冲突

3、手工维护Dubbo服务

java -jar edu-service-xxx.jar &
//&表示在后台运行,当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行。
kill PID
kill -9 PID

可能会报错

Name or service not know,dubbo version :2.5.3,current host :127.0.0.1
java.net.UnkownHostEception:edu-provider-02:edu-provider-02:Name or service not know
...
Caused by : java.net.UnknownHostException:edu-provider-02:Name or service not known

应用名edu-provider-02和主机名127.0.0.1没有做映射关系,但是不影响使用

vi /etv/hosts

192.1689.3.72(本机的ip) edu-provider-02

4、自定义Dubbo服务维护的Shell脚本

  • 脚本命名规范:

    /home/wusc/edu/service/xxx/service-xxx.sh

    home下的wusc/edu项目下的service中的某个service(xxx),里面的脚本(service-xxx.sh

    例如:

    /home/wusc/edu/service/user/service-user.sh
  • 效果:
cd /home/wusc/edu/service/user . /service-user.sh start
. /service-user.sh stop
. /service-user.sh restart
  • 脚本
//头定义
#!/bin/sh

## java env
//环境变量已经配置了JAVA_HOME,这里为什么还要配置JAVA_HOME?
//在linux脚本中,可能获取不到JAVA_HOME的路径,所以需要再次强调一下
export JAVA_HOME=/usr/local/java/jdk1.7.0_72
export JRE_HOME=$JAVA_HOME/jre

## service name
//下面多处地方需要用到servic name,为了使得这个脚本通用,通过配置的方式。
APP_NAME=user

//服务的目录
SERVICE_DIR=/home/wusc/edu/service/$APP_NAME
//服务的名称
SERVICE_NAME=edu-service-$APP_NAME
//jar包的名字
JAR_NAME=$SERVICE_NAME\.jar
//进程的id
PID=$SERVICE_NAME\.pid
//进入服务的目录
cd $SERVICE_DIR

//可以接收输入的参数,$1表示输入的第一个参数,比如a.sh start
case "$1" in
//如果是start
    start)
	    //内存调优参数,-Xms256m -Xmx512m
	    //>/dev/null nohup会把日志放在nohup.out中,这段脚本就是为了不再输出这一份日志,
	    //因为可能项目中已经有了存放日志的地方,没有的话客户以继续输出
	   	//对于& 1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。
		//对于2 ,表示标准错误,stderr。
		//2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null
		//可以把/dev/null 可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从	它那儿读取内容则什么也读不到.
	    //&作为守护进程
        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &
        //输出pid  $!  ====>    Shell最后运行的后台Process的PID
        //把pid输入到SERVICE_DIR下面的PID文件中
        echo $! > $SERVICE_DIR/$PID
        echo "=== start $SERVICE_NAME"
        //每个case的分支后都需要一个;;,表示该段程序结束(一定不能忘记)
        ;;
//如果是stop
    stop)
    	//杀掉上面运行的pid,为什么不用$! 因为start 和 stop是执行了两次脚本 pid不一样
        kill `cat $SERVICE_DIR/$PID`
        //删掉pid文件
        rm -rf $SERVICE_DIR/$PID
        echo "=== stop $SERVICE_NAME"
		//等待五秒钟再看看
        sleep 5
		//获取进程id,注意这里一定要是 “-w” ,全匹配,不加默认模糊匹配,在这里防止误杀进程
        P_ID=`ps -ef | grep -w "$SERVICE_NAME" | grep -v "grep" | awk '{print $2}'`
        //如果这个pid为空了
        if [ "$P_ID" == "" ]; then
        //输出这个进程为空了
            echo "=== $SERVICE_NAME process not exists or stop success"
        else
        //如果有pid就强杀
            echo "=== $SERVICE_NAME process pid is:$P_ID"
            echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"
            kill -9 $P_ID
        fi
        ;;
//如果输入stop
    restart)
    //$0当前脚本的文件名
        $0 stop
        sleep 2
        $0 start
        echo "=== restart $SERVICE_NAME"
        ;;
//如果什么也不输入,当然这里可以是提示操作人会员输入某些参数
    *)
        ## restart
        $0 stop
        sleep 2
        $0 start
        ;;
//每个case语句,以case开头,以esac结尾
esac
exit 0

5、服务维护注意事项(结合自定义的Shell脚本)

(1) 脚本规范---------尽可能通用(脚本放在任何一个服务中,不改或者尽量少改,就可以用)

$APP_NAME

(2) 守护进程

&

(3) 内存调优设置-----按需调整

-Xms256m -Xmx512m

(4) 日志处理---------只保留应用Log4j输出的日志

>/dev/null 2>&1

(5) 避免服务冲突 ----进程名、端口

在启动的时候判断下进程名和端口号是否被占用

(6) 避免进程误杀-----全匹配

脚本配置灵活高深,满足需求则可 可参考官方脚本样例

//这里的 -w就是全匹配,不加默认模糊匹配
 P_ID=`ps -ef | grep -w "$SERVICE_NAME" | grep -v "grep" | awk '{print $2}'`

构建并部署消费者服务的(tomcat)

本地测试下先,如果报错time out,可能是远程的端口没有开启,请到服务器上检查,是否允许远程调用端口。

vi /etc/sysconfig/iptables
//找到22(ssh端口)那句话复制一下,填入自己zookeeper的端口
//重启防火墙
service iptables restart

构建Dubbo服务消费者Web应用的war包

1、打包类型:war

2、包含的配置文件

3、依赖到的jar包(相关工程要先构建)

4、构建war包

<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>wusc.edu.common</groupId>
		<artifactId>edu-common-parent</artifactId>
		<version>1.0-SNAPSHOT</version>
		<relativePath>../edu-common-parent</relativePath>
	</parent>
	<groupId>wusc.edu.web</groupId>
	<artifactId>edu-web-boss</artifactId>
	<version>${edu-web-boss.version}</version>
	<packaging>war</packaging>
	<name>edu-web-boss</name>
	<url>http://maven.apache.org</url>
	<build>
		<finalName>edu-web-boss</finalName>
		<resources>
			<resource>
			//src/main/resources下的所有配置文件复制到${project.build.directory}/classes
				<targetPath>${project.build.directory}/classes</targetPath>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
				<includes>
					<include>**/*</include>
				</includes>
			</resource>
		</resources>
	</build>
	<dependencies>
			...
	</dependencies>
</project>

部署war包

1、环境变量配置(Java环境变量全平台统一)

2、部署目录规范

/home/wusc/edu/web/xxx-tomcat

3、Tomcat内存设置

4、设置Tomcat开机启动

详细步骤

IP: 192.168.2.61 部署容器:apache-tomcat-7.0.57 端口:8080 应用:edu-web-boss.war

1、 下载(或上传)最新版的 Tomcat7:

$wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57 .tar.gz

2、 规范安装目录: /home/wusc/edu/web/xxx-tomcat 如: /home/wusc/edu/web/boss-tomcat

3、 解压安装

$ mkdir –p /home/wusc/edu/web
$ tar -zxvf apache-tomcat-7.0.57.tar.gz
$ mv apache-tomcat-7.0.57 /home/wusc/edu/web/boss-tomcat

4、 移除/home/wusc/edu/web/boss-tomcat/webapps 目录下的所有文件:

$ rm -rf /home/wusc/edu/web/boss-tomcat/webapps/*

5、 上传 Dubbo 服务消费者 Web 应用 war 包 edu-web-boss.war 到/home/wusc/edu/web/boss-tomcat/webapps

6、 防火墙开启 8080 端口,用 root 用户修改/etc/sysconfig/iptables,

# vi /etc/sysconfig/iptables
//增加:
## boss-tomcat:8080
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
//重启防火墙:
# service iptables restart

7、 Tomat 内存设置:

$ vi /home/wusc/edu/web/boss-tomcat/bin/catalina.sh
//就在里面的第二行开始加入如下
#!/bin/sh
JAVA_OPTS='-Xms128m -Xmx512m -XX:PermSize=128m'

8、 启动 Tomat7

$ /home/wusc/edu/web/boss-tomcat/bin/startup.sh

9、 浏览

http://192.168.2.61:8080/edu-web-boss

10、 配置 Tomcat 开机启动:

在虚拟主机中编辑/etc/rc.local 文件,加入:

su - wusc -c '/home/wusc/edu/web/boss-tomcat/bin/startup.sh'

同样可能报错:

Name or service not know,dubbo version :2.5.3,current host :127.0.0.1
java.net.UnkownHostEception:edu-provider-02:edu-provider-02:Name or service not know
...
Caused by : java.net.UnknownHostException:edu-provider-02:Name or service not known

应用名edu-provider-02和主机名127.0.0.1没有做映射关系,但是不影响使用

vi /etv/hosts

192.1689.3.72(本机的ip) edu-provider-02

Dubbo监控中心的介绍与简易监控中心的安装(功能不是特别强大)

简介

  1. 监控中心的作用

    监控中心负责统计各服务调用的次数,调用时间等,统计先在内存汇总后每分钟一次发送的监控中心服务器,并以报表展示。

    为服务的监控运维采集数据。
  2. 监控中心是可选的(非必须)

    (1)monitor可以不安装

    (2)monitor关掉不会影响到consumer和provider之间的调用,只是丢失部分采样数据
  3. 监控中心可自定义扩展开发

    (1)个性化运维监控的需求:

    a 服务的健康状况

    b 服务的压力和性能状况

    c 告警通知以便及时处理等

    扩展接口:

    com.alibaba.dubbo.monitor.MonitorFactiry

    com.alibaba.dubbo.monitor.Monitor

安装

下载包

解压

tar -xvf xxx

重命名

mv xxx dubbo-monitor

修改配置

vi conf/dubbo.properties
//注释掉默认的广播地址
# dubbo.residtory.address=multicast://224.5.6.7.1234
//打开zookeeper的地址端口
dubbo.residtory.address=zookeeper://192.168.3.71:2182
//监控中心本身也是一个dubbo服务
dubbo.protocol.port=7070
//通过jetty启动在页面访问
//dubbo.jetty.port=8080

防火墙开启7080和8080端口,保证外网能够访问

启动

cd bin
./start.sh

访问 192.168.3.71:8090 (注意192.168.3.71上面配置的zookeeper也是这个目录,因为zookeeper和监控中心安装在了一起,这个网址里面的192.168.3.71指的是监控中心。)

页面中讲解

Home下有application、service,service指的不是由多少个dubbo服务,而是有多少个服务几口。

进入Home==》application==》simple-monitor==》providers==》有一个unregister按钮,点击的话就会将provider从注册中心去掉。

补充:

一、 监控中心服务接口调用统计报表的显示配置

1、 Dubbo 服务提供者和服务消费者中的 spring 配置文件中增加以下配置:

<!-- 监控中心配置 -->
<!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址, 否则直连监控中心 -->
<!-- 直连监控中心服务器地址,如:address="192.168.3.71:7070" -->
<dubbo:monitor protocol="registry"/>

配置截图如下:

添加完以上配置后,重新构建部署 Dubbo 服务和服务消费者应用。

2、 Dubbo 简易监控中心的配置解释(不需要修改,使用默认配置) 操作系统用户为 wusc,系统用户目录为/home/wusc

dubbo-monitor 的安装目录为:/home/wusc/dubbo-monitor

dubbo-monitor 的配置文件为:/home/wusc/dubbo-monitor/conf/dubbo.properties dubbo-monitor 的配置文件内容如下:

dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner= dubbo.registry.address=zookeeper://192.168.3.71:2181 dubbo.protocol.port=7070
dubbo.jetty.port=8090
dubbo.jetty.directory=${user.home}/monitor dubbo.charts.directory=${dubbo.jetty.directory}/charts dubbo.statistics.directory=${user.home}/monitor/statistics
dubbo.log4j.file=logs/dubbo-monitor-simple.log
dubbo.log4j.level=WARN

看上面配置文件中标红的的 3 行内容,理解user.home这个变量的意思则可,{user.home}这个变量的意思则可,user.home这个变量的意思则可,{user.home} 指的就是启动 dubbo-monitor 程序的操作系统用户目录。我们这里用的是 wusc 用户,那么 就是/home/wusc 目录(如果是 root 用户启动,那就是/root)。

此时,配置中 3 个目录的绝对路径为:

dubbo.jetty.directory=/home/wusc/monitor
dubbo.charts.directory=/home/wusc/monitor/charts dubbo.statistics.directory=/home/wusc/monitor/statistics

3、 重新启动 dubbo-monitor 简易监控中心,此时就会看到以上 3 个目录会被创新,并在目 录里面有相应的服务接口调用的报表数据。



4、 此时再进入 Dubbo 简易监控中心就能查看到对应的报表数据



Dubbo入门到精通学习笔记(二):Dubbo管理控制台、使用Maven构建Dubbo的jar包、在Linux上部署Dubbo privider服务(shell脚本)、部署consumer服务的更多相关文章

  1. Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

    文章目录 MyCat在MySQL主从复制的基础上实现读写分离 一.环境 二.依赖课程 三.MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ ) 四.MyCat 的安装 ...

  2. Dubbo入门到精通学习笔记(十二):Dubbo消费端直连提供者(开发调试)、Dubbo服务只订阅(开发调试)、Dubbo服务只注册

    文章目录 Dubbo消费端直连提供者(开发调试) Dubbo服务只订阅(开发调试) Dubbo服务只注册 Dubbo消费端直连提供者(开发调试) Dubbo 官方文档: 用户指南 >> 示 ...

  3. Dubbo入门到精通学习笔记(十三):ZooKeeper集群的安装、配置、高可用测试、升级、迁移

    文章目录 ZooKeeper集群的安装.配置.高可用测试 ZooKeeper 与 Dubbo 服务集群架构图 1. 修改操作系统的/etc/hosts 文件,添加 IP 与主机名映射: 2. 下载或上 ...

  4. Dubbo入门到精通学习笔记(九):简易版支付系统介绍、部署(单节点)

    文章目录 部署(单节点) 一.前期准备 二.对部署环境进行规划 创建数据库 调整公共配置文件 应用部署前期准备 部署服务 部署 Web 应用 部署定时任务 一. 工程结构 第三方支付系统架构 pay- ...

  5. Dubbo入门到精通学习笔记(一):Dubbo对传统工程进行改造、注册中心安装(Zookeeper-3.4.6)、工程结构优化

    文章目录 改造思路 样例工程:传统的单工程项目(edu-demo) 模型结构 思路 改成dubbo调用方式后的工程结构 部署环境规划 改造 愚公移山 迁移包 迁移页面: 迁移配置相关 新项目的主要作用 ...

  6. Dubbo入门到精通学习笔记(十八):使用Redis3.0集群实现Tomcat集群的Session共享

    文章目录 1.单节点访问http://192.168.1.61:8082/pay-web-boss/: 2.增加多一个消费者节点:192.168.1.62,以同样的方式部署pay-web-boss工程 ...

  7. Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则

    文章目录 dubbo服务集群 Dubbo服务集群部署 Dubbo服务集群容错配置--集群容错模式 1.Failover Cluster 失败自动切换,当出现失败,重试其它服务器.`(缺省) 通常用于读 ...

  8. Dubbo入门到精通学习笔记(六):持续集成管理平台之Hudson 持续集成服务器的安装配置与使用

    文章目录 安装Hudson 使用Hudson tips:自动化部署 附录:两个脚本 安装Hudson IP:192.168.4.221 8G 内存(Hudson 多个工程在同时构建的情况下比较耗内存) ...

  9. Dubbo入门到精通学习笔记(四):持续集成管理平台之Maven私有库和本地库的安装与配置

    文章目录 介绍 Maven私有库和本地库的安装与配置 Nexus安装 Nexus 配置(登录后) 介绍 如果构建的Maven项目本地仓库没有对应的依赖包,那么就会去Nexus私服去下载, 那么如果Ne ...

随机推荐

  1. HashCode方法整理

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  2. 启动项目时,Mysql的连接问题

    1.com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection ...

  3. 201⑨湘潭邀请赛 Chika and Friendly Pairs(HDU6534)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6534 题意: 给你一个数组,对于第i个数来说,如果存在一个位置j,使得j>i并且a[j]-k&l ...

  4. 引用so动态链接库的方法

    from ctypes import cdll lib = cdll.LoadLibrary('/home/zhengli/test/test.so') lib.func() 总结: 1.引用ctyp ...

  5. strcoll - 用当前的区域选项来比较两个字符串

    总览 (SYNOPSIS) #include <string.h> int strcoll(const char *s1, const char *s2); 描述 (DESCRIPTION ...

  6. su - 运行替换用户和组标识的shell

    SYNOPSIS(总览) su [OPTION]... [-] [USER [ARG]...] DESCRIPTION(描述) 修改有效用户标识和组标识为USER的. -, -l, --login 使 ...

  7. mysql导入.csv文件出错

    1.报错信息 ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cann ...

  8. 聚合函数 -AVG/MAX/MIN/STDDEV/VARIANCE/SUM/COUNT/MEDIAN

    ------------------------------------------聚合函数--------------------------------------------- --1: AVG ...

  9. 【LeetCode】水题(刚开始重新刷题找感觉用的)

    [9] Palindrome Number [Easy] 给一个数字,用不转化成字符串的方式判断它是否是回文. 先求数字长度,然后把数字的后半段做翻转(就是不断地取模,除10这种方式),然后判断前后半 ...

  10. 【Luogu】【关卡2-15】动态规划的背包问题(2017年10月)【还差一道题】

    任务说明:这是最基础的动态规划.不过如果是第一次接触会有些难以理解.加油闯过这个坎. 01背包二维数组优化成滚动数组的时候有坑有坑有坑!!!必须要downto,downto,downto 情景和代码见 ...