当前位置:   article > 正文

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

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

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:

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

2、 解压:

  1. $ tar -zxvf apache-tomcat-7.0.57.tar.gz
  2. $ 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/):

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

(以上密码在正式上生产前要修改)
7、 防火墙开启 8080 端口,用 root 用户修改/etc/sysconfig/iptables

 # vi /etc/sysconfig/iptables

增加:

  1. ## dubbo-admin-tomcat:8080
  2. -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中配置

  1. <web-app>
  2. <context-param>
  3. <param-name>contextConfigLocation</param-name>
  4. <param-value>classpath:spring/spring-context.xml</param-value>
  5. </context-param>
  6. </web-app>

然后通过tomcat启动即可

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

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

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

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

  1. package dubbo.test;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. /**
  6. *
  7. * @描述: 启动Dubbo服务用的MainClass.
  8. * @作者: WuShuicheng .
  9. * @创建时间: 2013-11-5,下午9:47:55 .
  10. * @版本: 1.0 .
  11. */
  12. public class DubboProvider {
  13. private static final Log log = LogFactory.getLog(DubboProvider.class);
  14. public static void main(String[] args) {
  15. try {
  16. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml");
  17. context.start();
  18. } catch (Exception e) {
  19. log.error("== DubboProvider context start error:",e);
  20. }
  21. synchronized (DubboProvider.class) {
  22. while (true) {
  23. try {
  24. DubboProvider.class.wait();
  25. } catch (InterruptedException e) {
  26. log.error("== synchronized error:",e);
  27. }
  28. }
  29. }
  30. }
  31. }

缺点: 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节点

  1. //项目构建项目的时候用的
  2. <build>
  3. //构建的项目名
  4. <finalName>edu-service-user</finalName>
  5. <resources>
  6. //将resource下的所有配置文件构建进来
  7. <resource>
  8. <targetPath>${project.build.directory}/classes</targetPath>
  9. <directory>src/main/resources</directory>
  10. <filtering>true</filtering>
  11. <includes>
  12. <include>**/*.xml</include>
  13. <include>**/*.properties</include>
  14. </includes>
  15. </resource>
  16. <!-- 结合com.alibaba.dubbo.container.Main -->
  17. //为什么有这一步?
  18. //dubbo官方文档中说:如果用到com.alibaba.dubbo.container.Main这个类启动的话,
  19. //会自动加载META-INF/spring目录下的所有的spring配置,如何配置?
  20. //配置在java命令-D参数或者dubbo.properties中
  21. // dubbo.spring.config-classpath*:META-INF/spring/*.xml====》配置spring配置加载位置
  22. //因为我们项目中spring的配置文件是在src/main/resources/spring下的
  23. //所以这里的作用就是把这些配置文件在加载的时候放在
  24. //${project.build.directory}/classes/META-INF/spring目录下
  25. <resource>
  26. <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
  27. <directory>src/main/resources/spring</directory>
  28. <filtering>true</filtering>
  29. <includes>
  30. <include>spring-context.xml</include>
  31. </includes>
  32. </resource>
  33. </resources>
  34. //插件管理
  35. <pluginManagement>
  36. <plugins>
  37. <!-- 解决Maven插件在Eclipse内执行了一系列的生命周期引起冲突 -->
  38. <plugin>
  39. <groupId>org.eclipse.m2e</groupId>
  40. <artifactId>lifecycle-mapping</artifactId>
  41. <version>1.0.0</version>
  42. <configuration>
  43. <lifecycleMappingMetadata>
  44. <pluginExecutions>
  45. <pluginExecution>
  46. <pluginExecutionFilter>
  47. <groupId>org.apache.maven.plugins</groupId>
  48. <artifactId>maven-dependency-plugin</artifactId>
  49. <versionRange>[2.0,)</versionRange>
  50. <goals>
  51. <goal>copy-dependencies</goal>
  52. </goals>
  53. </pluginExecutionFilter>
  54. <action>
  55. <ignore />
  56. </action>
  57. </pluginExecution>
  58. </pluginExecutions>
  59. </lifecycleMappingMetadata>
  60. </configuration>
  61. </plugin>
  62. </plugins>
  63. </pluginManagement>
  64. <plugins>
  65. <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
  66. <plugin>
  67. <groupId>org.apache.maven.plugins</groupId>
  68. <artifactId>maven-jar-plugin</artifactId>
  69. <configuration>
  70. //把target/classes/下所有的文件拷贝到jar包里面去
  71. <classesDirectory>target/classes/</classesDirectory>
  72. <archive>
  73. //可执行jar包的main类
  74. <manifest>
  75. <mainClass>com.alibaba.dubbo.container.Main</mainClass>
  76. <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
  77. //这里是因为maven每打一个版本会有一个时间戳,
  78. //一个奇怪的问题是,下载下来的版本不是一个带时间戳的版本,
  79. //就会出现有些程序和类包引用不到
  80. <useUniqueVersions>false</useUniqueVersions>
  81. //依赖的路径
  82. <addClasspath>true</addClasspath>
  83. //把项目需要的jar包方法lib目录中去
  84. //项目依赖的路径是lib
  85. <classpathPrefix>lib/</classpathPrefix>
  86. </manifest>
  87. <manifestEntries>
  88. <Class-Path>.</Class-Path>
  89. </manifestEntries>
  90. </archive>
  91. </configuration>
  92. </plugin>
  93. //把服务的jar包指向${project.build.directory}/lib
  94. <plugin>
  95. <groupId>org.apache.maven.plugins</groupId>
  96. <artifactId>maven-dependency-plugin</artifactId>
  97. <executions>
  98. <execution>
  99. <id>copy-dependencies</id>
  100. <phase>package</phase>
  101. <goals>
  102. <goal>copy-dependencies</goal>
  103. </goals>
  104. <configuration>
  105. <type>jar</type>
  106. <includeTypes>jar</includeTypes>
  107. <useUniqueVersions>false</useUniqueVersions>
  108. <outputDirectory>
  109. ${project.build.directory}/lib
  110. </outputDirectory>
  111. </configuration>
  112. </execution>
  113. </executions>
  114. </plugin>
  115. </plugins>
  116. </build>

dependence节点

  1. <dependencies>
  2. //注意这里面的四个是项目依赖的其他项目,虽然都在eclipse里面,但是
  3. //maven找的时候是去repository中去拿
  4. //所以应该先去构建,否则会报错
  5. //对其他项目执行 mvn install 命令
  6. <dependency>
  7. <groupId>wusc.edu.common</groupId>
  8. <artifactId>edu-common</artifactId>
  9. <version>${edu-common.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>wusc.edu.common</groupId>
  13. <artifactId>edu-common-config</artifactId>
  14. <version>${edu-common-config.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>wusc.edu.common</groupId>
  18. <artifactId>edu-common-core</artifactId>
  19. <version>${edu-common-core.version}</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>wusc.edu.facade</groupId>
  23. <artifactId>edu-facade-user</artifactId>
  24. <version>${edu-facade-user.version}</version>
  25. </dependency>
  26. <!-- Common Dependency Begin -->
  27. <dependency>
  28. <groupId>antlr</groupId>
  29. <artifactId>antlr</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>aopalliance</groupId>
  33. <artifactId>aopalliance</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.aspectj</groupId>
  37. <artifactId>aspectjweaver</artifactId>
  38. </dependency>
  39. <dependency>
  40. <groupId>cglib</groupId>
  41. <artifactId>cglib</artifactId>
  42. </dependency>
  43. <dependency>
  44. <groupId>net.sf.json-lib</groupId>
  45. <artifactId>json-lib</artifactId>
  46. <classifier>jdk15</classifier>
  47. <scope>compile</scope>
  48. </dependency>
  49. <dependency>
  50. <groupId>ognl</groupId>
  51. <artifactId>ognl</artifactId>
  52. </dependency>
  53. <dependency>
  54. <groupId>oro</groupId>
  55. <artifactId>oro</artifactId>
  56. </dependency>
  57. <dependency>
  58. <groupId>commons-beanutils</groupId>
  59. <artifactId>commons-beanutils</artifactId>
  60. </dependency>
  61. <dependency>
  62. <groupId>commons-codec</groupId>
  63. <artifactId>commons-codec</artifactId>
  64. </dependency>
  65. <dependency>
  66. <groupId>commons-collections</groupId>
  67. <artifactId>commons-collections</artifactId>
  68. </dependency>
  69. <dependency>
  70. <groupId>commons-digester</groupId>
  71. <artifactId>commons-digester</artifactId>
  72. </dependency>
  73. <dependency>
  74. <groupId>commons-fileupload</groupId>
  75. <artifactId>commons-fileupload</artifactId>
  76. </dependency>
  77. <dependency>
  78. <groupId>commons-io</groupId>
  79. <artifactId>commons-io</artifactId>
  80. </dependency>
  81. <dependency>
  82. <groupId>org.apache.commons</groupId>
  83. <artifactId>commons-lang3</artifactId>
  84. </dependency>
  85. <dependency>
  86. <groupId>commons-logging</groupId>
  87. <artifactId>commons-logging</artifactId>
  88. </dependency>
  89. <dependency>
  90. <groupId>commons-validator</groupId>
  91. <artifactId>commons-validator</artifactId>
  92. </dependency>
  93. <dependency>
  94. <groupId>dom4j</groupId>
  95. <artifactId>dom4j</artifactId>
  96. </dependency>
  97. <dependency>
  98. <groupId>net.sf.ezmorph</groupId>
  99. <artifactId>ezmorph</artifactId>
  100. </dependency>
  101. <dependency>
  102. <groupId>javassist</groupId>
  103. <artifactId>javassist</artifactId>
  104. </dependency>
  105. <dependency>
  106. <groupId>jstl</groupId>
  107. <artifactId>jstl</artifactId>
  108. </dependency>
  109. <dependency>
  110. <groupId>javax.transaction</groupId>
  111. <artifactId>jta</artifactId>
  112. </dependency>
  113. <dependency>
  114. <groupId>log4j</groupId>
  115. <artifactId>log4j</artifactId>
  116. </dependency>
  117. <dependency>
  118. <groupId>org.slf4j</groupId>
  119. <artifactId>slf4j-api</artifactId>
  120. </dependency>
  121. <dependency>
  122. <groupId>org.slf4j</groupId>
  123. <artifactId>slf4j-log4j12</artifactId>
  124. </dependency>
  125. <!-- Common Dependency End -->
  126. <!-- Spring Dependency Begin -->
  127. //此处省略spring的依赖
  128. <!-- Spring Dependency End -->
  129. <!-- MyBatis Dependency Begin -->
  130. //此处省略MyBaties的依赖
  131. <!-- MyBatis Dependency End -->
  132. <!-- Struts2 Dependency Begin -->
  133. //此处省略Struts2的依赖
  134. <!-- Struts2 Dependency End -->
  135. <!-- Others Begin -->
  136. <dependency>
  137. <groupId>org.apache.tomcat</groupId>
  138. <artifactId>servlet-api</artifactId>
  139. <scope>provided</scope>
  140. </dependency>
  141. <dependency>
  142. <groupId>org.apache.tomcat</groupId>
  143. <artifactId>jsp-api</artifactId>
  144. <scope>provided</scope>
  145. </dependency>
  146. <dependency>
  147. <groupId>com.alibaba</groupId>
  148. <artifactId>druid</artifactId>
  149. </dependency>
  150. <dependency>
  151. <groupId>org.jsoup</groupId>
  152. <artifactId>jsoup</artifactId>
  153. </dependency>
  154. <!-- Others End -->
  155. <!-- Mysql Driver Begin -->
  156. <dependency>
  157. <groupId>mysql</groupId>
  158. <artifactId>mysql-connector-java</artifactId>
  159. </dependency>
  160. <!-- Mysql Driver End -->
  161. <!-- dubbo 需要的jar start -->
  162. <dependency>
  163. <groupId>org.jboss.netty</groupId>
  164. <artifactId>netty</artifactId>
  165. </dependency>
  166. <dependency>
  167. <groupId>com.alibaba</groupId>
  168. <artifactId>dubbo</artifactId>
  169. <exclusions>
  170. <exclusion>
  171. <groupId>org.springframework</groupId>
  172. <artifactId>spring</artifactId>
  173. </exclusion>
  174. </exclusions>
  175. </dependency>
  176. <dependency>
  177. <groupId>org.apache.zookeeper</groupId>
  178. <artifactId>zookeeper</artifactId>
  179. </dependency>
  180. <dependency>
  181. <groupId>com.101tec</groupId>
  182. <artifactId>zkclient</artifactId>
  183. </dependency>
  184. <!-- dubbo 需要的jar end -->
  185. </dependencies>

打包

mvn  clean package

最后java -jar启动即可。

在Linux上部署Dubbo服务

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

  1. vi /etc/profile
  2. ## java env
  3. export JAVA_HOME=/usr/local/java/jdk1.7.0_72
  4. export JRE_HOME=$JAVA_HOME/jre
  5. 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
  6. source /etc/profile

2、部署目录规范

在这里插入图片描述
要避免应用迁移时的路径冲突

3、手工维护Dubbo服务

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

可能会报错

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

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

  1. vi /etv/hosts
  2. 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
  • 效果:
  1. cd /home/wusc/edu/service/user . /service-user.sh start
  2. . /service-user.sh stop
  3. . /service-user.sh restart
  • 脚本
  1. //头定义
  2. #!/bin/sh
  3. ## java env
  4. //环境变量已经配置了JAVA_HOME,这里为什么还要配置JAVA_HOME?
  5. //在linux脚本中,可能获取不到JAVA_HOME的路径,所以需要再次强调一下
  6. export JAVA_HOME=/usr/local/java/jdk1.7.0_72
  7. export JRE_HOME=$JAVA_HOME/jre
  8. ## service name
  9. //下面多处地方需要用到servic name,为了使得这个脚本通用,通过配置的方式。
  10. APP_NAME=user
  11. //服务的目录
  12. SERVICE_DIR=/home/wusc/edu/service/$APP_NAME
  13. //服务的名称
  14. SERVICE_NAME=edu-service-$APP_NAME
  15. //jar包的名字
  16. JAR_NAME=$SERVICE_NAME\.jar
  17. //进程的id
  18. PID=$SERVICE_NAME\.pid
  19. //进入服务的目录
  20. cd $SERVICE_DIR
  21. //可以接收输入的参数,$1表示输入的第一个参数,比如a.sh start
  22. case "$1" in
  23. //如果是start
  24. start)
  25. //内存调优参数,-Xms256m -Xmx512m
  26. //>/dev/null nohup会把日志放在nohup.out中,这段脚本就是为了不再输出这一份日志,
  27. //因为可能项目中已经有了存放日志的地方,没有的话客户以继续输出
  28. //对于& 1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。
  29. //对于2 ,表示标准错误,stderr。
  30. //2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null
  31. //可以把/dev/null 可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从 它那儿读取内容则什么也读不到.
  32. //&作为守护进程
  33. nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &
  34. //输出pid $! ====> Shell最后运行的后台Process的PID
  35. //把pid输入到SERVICE_DIR下面的PID文件中
  36. echo $! > $SERVICE_DIR/$PID
  37. echo "=== start $SERVICE_NAME"
  38. //每个case的分支后都需要一个;;,表示该段程序结束(一定不能忘记)
  39. ;;
  40. //如果是stop
  41. stop)
  42. //杀掉上面运行的pid,为什么不用$! 因为start 和 stop是执行了两次脚本 pid不一样
  43. kill `cat $SERVICE_DIR/$PID`
  44. //删掉pid文件
  45. rm -rf $SERVICE_DIR/$PID
  46. echo "=== stop $SERVICE_NAME"
  47. //等待五秒钟再看看
  48. sleep 5
  49. //获取进程id,注意这里一定要是 “-w” ,全匹配,不加默认模糊匹配,在这里防止误杀进程
  50. P_ID=`ps -ef | grep -w "$SERVICE_NAME" | grep -v "grep" | awk '{print $2}'`
  51. //如果这个pid为空了
  52. if [ "$P_ID" == "" ]; then
  53. //输出这个进程为空了
  54. echo "=== $SERVICE_NAME process not exists or stop success"
  55. else
  56. //如果有pid就强杀
  57. echo "=== $SERVICE_NAME process pid is:$P_ID"
  58. echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"
  59. kill -9 $P_ID
  60. fi
  61. ;;
  62. //如果输入stop
  63. restart)
  64. //$0当前脚本的文件名
  65. $0 stop
  66. sleep 2
  67. $0 start
  68. echo "=== restart $SERVICE_NAME"
  69. ;;
  70. //如果什么也不输入,当然这里可以是提示操作人会员输入某些参数
  71. *)
  72. ## restart
  73. $0 stop
  74. sleep 2
  75. $0 start
  76. ;;
  77. //每个case语句,以case开头,以esac结尾
  78. esac
  79. exit 0

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

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

$APP_NAME

(2) 守护进程

&

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

-Xms256m -Xmx512m 

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

>/dev/null 2>&1

(5) 避免服务冲突 ----进程名、端口
在启动的时候判断下进程名和端口号是否被占用
(6) 避免进程误杀-----全匹配
脚本配置灵活高深,满足需求则可 可参考官方脚本样例

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

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

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

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

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

1、打包类型:war
2、包含的配置文件
3、依赖到的jar包(相关工程要先构建)
4、构建war包

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <groupId>wusc.edu.common</groupId>
  6. <artifactId>edu-common-parent</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <relativePath>../edu-common-parent</relativePath>
  9. </parent>
  10. <groupId>wusc.edu.web</groupId>
  11. <artifactId>edu-web-boss</artifactId>
  12. <version>${edu-web-boss.version}</version>
  13. <packaging>war</packaging>
  14. <name>edu-web-boss</name>
  15. <url>http://maven.apache.org</url>
  16. <build>
  17. <finalName>edu-web-boss</finalName>
  18. <resources>
  19. <resource>
  20. //src/main/resources下的所有配置文件复制到${project.build.directory}/classes
  21. <targetPath>${project.build.directory}/classes</targetPath>
  22. <directory>src/main/resources</directory>
  23. <filtering>true</filtering>
  24. <includes>
  25. <include>**/*</include>
  26. </includes>
  27. </resource>
  28. </resources>
  29. </build>
  30. <dependencies>
  31. ...
  32. </dependencies>
  33. </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、 解压安装

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

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

  1. $ 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,

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

7、 Tomat 内存设置:

  1. $ vi /home/wusc/edu/web/boss-tomcat/bin/catalina.sh
  2. //就在里面的第二行开始加入如下
  3. #!/bin/sh
  4. 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'

同样可能报错:

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

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

  1. vi /etv/hosts
  2. 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

修改配置

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

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

  1. cd bin
  2. ./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 配置文件中增加以下配置:

  1. <!-- 监控中心配置 -->
  2. <!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址, 否则直连监控中心 -->
  3. <!-- 直连监控中心服务器地址,如:address="192.168.3.71:7070" -->
  4. <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 的配置文件内容如下:

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

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

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

3、 重新启动 dubbo-monitor 简易监控中心,此时就会看到以上 3 个目录会被创新,并在目 录里面有相应的服务接口调用的报表数据。
在这里插入图片描述
4、 此时再进入 Dubbo 简易监控中心就能查看到对应的报表数据
在这里插入图片描述
在这里插入图片描述

转载于:https://www.cnblogs.com/LeesinDong/p/10835336.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/771837
推荐阅读
相关标签
  

闽ICP备14008679号