参考博客:

小宝鸽:https://blog.csdn.net/u013142781/article/details/50387583

https://blog.csdn.net/u013142781/article/details/50396621

过滤器:https://blog.csdn.net/u014394255/article/details/53983685

参数:https://www.cnblogs.com/xrq730/p/5316805.html

架构:https://blog.csdn.net/hzzhoushaoyu/article/details/43273099

(对集群服务的)ZooKeeper分布式协调原理

同一个服务的多个节点,在该服务节点下创建临时节点,订阅者使用Watcher监控所有服务节点的字节点列表,新增则通知,故障则自动删除,也会通知(推),在通知回调里再主动拉取列表(拉)

Dubbo的远程服务调用

Spring容器根据Schema扩展解析dubbo标签,创建服务Bean,消费端则创建远程调用代理。服务端在容器启动时到注册中心注册服务信息。消费端只从注册中心获取可用服务端信息,使用负载均衡算法选取一个服务,然后直接调取服务,不走注册中心。采用hession等序列化,在连接上远程调用。实际是远端本地线程接收到连接上的远程参数,调用本地方法,返回结果。

部署dubbo-admin 2.5.4常见异常

Java1.8环境下异常

  1. ERROR context.ContextLoader - Context initialization failed
  2. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uriBrokerService': Cannot create inner bean '(inner bean)' of type [com.alibaba.citrus.service.uribroker.impl.URIBrokerServiceImpl$URIBrokerInfo] while setting bean property 'brokers' with key [0]; nested excepti
  3. on is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#25': Cannot create inner bean 'server' of type [com.alibaba.citrus.service.uribroker.uri.GenericURIBroker] while setting constructor argument; nested exception is org.springframework.beans.fact
  4. ory.BeanCreationException: Error creating bean with name 'server': Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'URIType' of bean class [com.alibaba.citrus.service.uribroker.uri.GenericURIBroker]: Bean property 'URIType'
  5. is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
  6. at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:230)
  7. at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122)
  8. at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:287)

解决办法:

方法1:

我使用的是JDK 1.8.0_05, dubbo-admin版本是2.5.4-SNAPSHOT,也遇到了一样的问题。解决方案如@ddatsh

1、webx的依赖改为3.1.6版;

  1. <dependency>
  2. <groupId>com.alibaba.citrus</groupId>
  3. <artifactId>citrus-webx-all</artifactId>
  4. <version>3.1.6</version>
  5. </dependency>

2、添加velocity的依赖,我用了1.7;

  1. <dependency>
  2. <groupId>org.apache.velocity</groupId>
  3. <artifactId>velocity</artifactId>
  4. <version>1.7</version>
  5. </dependency>

3、对依赖项dubbo添加exclusion,避免引入旧spring

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>dubbo</artifactId>
  4. <version>${project.parent.version}</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>

4、webx已有spring 3以上的依赖,因此注释掉dubbo-admin里面的spring依赖

  1. <!--<dependency>-->
  2. <!--<groupId>org.springframework</groupId>-->
  3. <!--<artifactId>spring</artifactId>-->
  4. <!--</dependency>-->

确定war包解压后lib目录没有spring 3 以下的依赖就行。然后运行正常了。

方法2:

或干脆把环境降级为jdk1.7(不推荐,我1.8按上述办法修改、运行成功了!!)

参考:

https://github.com/apache/incubator-dubbo/issues/50

https://blog.csdn.net/liutengteng130/article/details/47112683

https://blog.csdn.net/blue_dd/article/details/51298438

Maven编译(打包)dubbo-admin 2.5.4异常

[ERROR] Failed to execute goal on project dubbo-admin: Could not resolve dependencies for project com.alibaba:dubbo-admin:war:2.5.4-SNAPSHOT: Could not find artifact com.alibaba:dubbo:jar:2.5.4-SNAPSHOT -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException

原因是maven库里没有该dubbo的jar包

解决办法:

方法1:

到GitHub搜索dubbo 2.5.4整个工程(包含多个子工程,里面就有dubbo-admin)源码,按上述第一个异常修改其中dubbo-admin的pom.xml(为了在jdk1.8下运行不报错),再回到父工程dubbo带pom.xml的根目录执行,不用管中途各种异常,最后会成功。这样修改过的dubbo-admin也会直接打成war包,在其目录下找得到,直接拖到Tomcat下运行,成功。

方法2:

把dubbo-admin项目的pom.xml的

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>dubbo</artifactId>
  4. <version>${project.parent.version}</version>
  5. </dependency>

改为

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>dubbo</artifactId>
  4. <version>2.5.3</version>
  5. </dependency>

重新build即可!

参考:

https://blog.csdn.net/qq_26508409/article/details/78443915?fps=1&locationNum=2

https://blog.csdn.net/zsmissyou/article/details/62445899

https://www.cnblogs.com/xhkj/p/7407092.html

启动dubbo-admin

先启动ZooKeeper再使用Tomcat启动dubbo-admin,到解压的webapps目录找到dubbo-admin->WEB-INF下的dubbo.properties,查看默认用户密码,两个:root/root,和guest/guest

浏览器访问这个项目,输入这两个用户名/密码,成功!

普通Web工程改造为Dubbo服务化分布式工程思路

1.将业务逻辑层及以下的Dao层分离出单独Dubbo服务

a.仍使用Spring整合MyBatis,管理Service,Dao等Model实例的创建与注入

b.Spring主配置文件引入(import)provider.xml配置,用于启动Dubbo服务,因为Dubbo使用Spring的Schema扩展管理

c.可部署为普通工程或Web工程,启动Spring,这样就启动了Dubbo服务,Dubbo服务使用Spring创建服务实体,注入底层依赖,并向ZooKeeper注册服务

2.控制器层留在Web工程中,作为Dubbo消费者调用1中的服务

a.仍使用Spring配置,将Spring主配置文件引入(import)consumer.xml配置,在Web启动Spring时创建Dubbo远程服务代理,在控制器层注入代理,到ZooKeeper订阅所需服务(经测试,消费端是在第一次调用服务时,才访问注册中心,而不是在启动时),获取远程服务调用信息,调用服务时,在服务列表中使用负载均衡算法选取一台机器,如有变更,注册中心基于长连接通知消费端,消费端重新获取服务列表

b.Web工程和普通工程的本质区别,是前者通过Web服务器(Tomcat)启动Web服务(HTTP服务,底层是Socket监听),将URL映射为本地方法调用,这些方法是通过Servlet接口注册到Web服务器的。整合了Spring Web(SpringMVC)后,统一由一个Servlet处理(DispatcherServlet),按照Spring配置解析URL分发请求到Controller.这些Controller是从Spring容器获取并注入依赖的,而Spring容器是Servlet从ServletContext对象中获取的,这个对象在Web服务器启动时由服务器为部署的应用创建,整合Spring时通过启动时的监听器(Listener)创建Spring容器并放入ServletContext中,同时Spring容器也保存一份对ServletContext的引用。

c.如果都部署为普通工程,就需要手动调用Spring API获取服务对象,无法使用HTTP访问(没有HTTP服务监听,也没有URL映射、Servlet调用)。

3.需要一个ZooKeeper注册中心,1启动时向其注册,2从ZooKeeper中获取服务进行服务调用

4.部署时注意:

1中工程是在Maven中使用Dubbo官方主类和打在classpath下的META-INF/spring中的spring配置(使用maven的resource配置,可以配置源和目标位置,包含你想要打包到jar包特定位置的任何class资源和配置文件,记住显式配置就要写全,包含main/java,main/resources等,否则有些情况下会出现无法找到main/java下所需的相关依赖包的情况)打成了jar包,使用命令行java -jar直接启动,提高效率。使用官方主类,记得这样配置maven:

  1. <resources>
    <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 -->
    <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>

在目标位置的/META-INF/spring包含了spring-context.xml,而spring-context.xml中这样配置:

  1. <import resource="classpath:spring/spring-mybatis.xml" />
    <import resource="classpath:spring/dubbo-provider.xml" />

因为打包到目标位置后,上述两个配置文件已经和/META-INF/spring下的spring-context.xml不在同一个目录了,而是仍在classpath目录,因为/META-INF/spring下没包含它们两个,所以需要使用classpath指定!!

使用Tomcat启动不推荐且依赖报错,因为打包位置不对应。

2中工程在IDEA中部署时提示找不到依赖的配置文件工程中的配置文件,手动拷贝一份过来,在Artifacts中自动生成的普通war可以正常启动,不能打成war:exploded

注意Druid使用配置,原来配置成了非对称加密登录数据库方式,这里去掉,数据源才能正常连接数据库。

测试用户的sha1加密的用户密码可以使用main方法,验证时同样的加密类加密测试明文密码得到(实际就是sha1算法,不是sha1后再hex,和在线工具得到的结果相同),先存入数据库,供正常登录。

RSA非对称加密错误参考:

https://segmentfault.com/q/1010000008473902

https://blog.csdn.net/kzcming/article/details/80109943

1的Jar包之所以在依赖其他jar的情况下能在Windows下的文件夹直接执行,是因为maven配置时使用了插件:

  1. <plugins>
    <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
    <classesDirectory>target/classes/</classesDirectory>
    <archive>
    <manifest>
    <mainClass>com.alibaba.dubbo.container.Main</mainClass>
    <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
    <useUniqueVersions>false</useUniqueVersions>
    <addClasspath>true</addClasspath>
    <classpathPrefix>lib/</classpathPrefix>
    </manifest>
    <manifestEntries>
    <Class-Path>.</Class-Path>
    </manifestEntries>
    </archive>
    </configuration>
    </plugin>
    <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>

这样会在同一个文件夹中生成lib/目录,包含了所有依赖工程的包和其他jar包,且1的Jar包的META-INF/MANIFEST.MF文件中依赖了lib/下的这些jar包!!所以我们在部署到其他系统时需要把生成的lib/目录也拷贝过去,且和1的Jar包在同一个目录下,才能正确执行!!

1依赖的其他工程jar包,也需要先进行工程maven打包,私有库里才有,这样1打包时才能将这些工程打好的jar包包含到依赖lib/里面来,否则会报错!

2打的是war包,打好的包里已经包含lib/目录,里面有其Web工程依赖的所有包,所以不需要像1那样做!!

但发现spring boot的jar工程,使用spring boot的maven插件,把依赖lib/都打在了jar包里,并在MANIFEST.MF文件中配置了这些依赖信息,不需要像1那样做。

部署脚本:grep -w参数,精确匹配启动的服务名;``反引号获取命令执行结果;awk'print{$2}'获取输出进程号;$!获取进程号

防火墙的端口放行配置(/etc/sysconfig/iptables中添加-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT);重启防火墙(service iptables restart)

Tomcat内存设置(catalina.sh首行JAVA_OPTS='-Xms128m -Xmx512m -XX:PermSize=128m')和线程、连接优化;Tomcat开机启动(/etc/rc.local中加入启动命令)

配置本机主机名:/etc/hosts文件

5.简易监控中心

需要依赖jetty相关lib,可以根据Monitor等接口进行扩展,可以自己写,charts目录需要放在jetty.directory目录下,否则页面访问不了,使用磁盘存储统计信息,注意磁盘规划,集群情况下使用mount挂载共享磁盘

进入conf/dubbo.properties配置监控中心服务(也是一个Dubbo服务)的ZooKeeper地址,启动端口,依赖的jetty端口(不要与已启动的tomcat等冲突)。其他默认。${user.home}代表登录用户家目录

防火墙放行这些端口

Dubbo学习参考的更多相关文章

  1. dubbo 官方参考手册~备案(防止哪天阿里一生气把dubbo给删除了)

          首页  ||  下载  ||  用户指南  ||  开发者指南  ||  管理员指南  ||  培训文档  ||  常见问题解答  ||  发布记录  ||  发展路线  ||  社区 E ...

  2. Dubbo学习(六) dubbo 架构图 以及调用过程

    一.Dubbo结构图   duubo结构图 我们解释以下这个架构图:Consumer服务消费者,Provider服务提供者.Container服务容器.消费当然是invoke提供者了,invoke这条 ...

  3. Dubbo学习(一) Dubbo原理浅析

    一.初入Dubbo Dubbo学习文档: http://dubbo.incubator.apache.org/books/dubbo-user-book/ http://dubbo.incubator ...

  4. dubbo学习小结

    dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...

  5. 【Dubbo学习】

    dubbo的介绍 dubbo是一个分布式的开源框架,其核心部分如下: 1.服务提供者:provider 2.服务消费者:consumer 3.注册中心:registry (仅仅只是负责通知) 服务者在 ...

  6. Dubbo学习系列之十三(Mycat数据库代理)

    软件界有只猫,不用我说,各位看官肯定知道是哪只,那就是大名鼎鼎的Tomcat,现在又来了一只猫,据说是位东方萌妹子,暂且认作Tom猫的表妹,本来叫OpencloudDB,后又改名为Mycat,或许Ca ...

  7. Dubbo学习系列之八(分布式事务之MQ方案)

    自从小王玩起了微服务,发现微服务果然很强大,好处真是太多,心中暗喜,然而,却也遇到了分布式中最棘手的问题:分布式事务.小王遍访各路神仙,也无个完美开源解决方案,当然,也有些实际可行的手法,虽不算完美, ...

  8. Dubbo学习系列之九(Shiro+JWT权限管理)

    村长让小王给村里各系统来一套SSO方案做整合,隔壁的陈家村流行使用Session+认证中心方法,但小王想尝试点新鲜的,于是想到了JWT方案,那JWT是啥呢?JavaWebToken简称JWT,就是一个 ...

  9. Dubbo学习系列之十五(Seata分布式事务方案TCC模式)

    上篇的续集. 工具: Idea201902/JDK11/Gradle5.6.2/Mysql8.0.11/Lombok0.27/Postman7.5.0/SpringBoot2.1.9/Nacos1.1 ...

随机推荐

  1. 前端 HTML标签介绍

    那什么是HTML标签呢? 1. 在HTML中规定标签使用英文的的尖括号即"<"和">"包起来,如`<html>`.`<p>` ...

  2. python platform模块

    该模块用来访问平台相关属性. 常见属性和方法 系统名称 platform.system() 返回系统/操作系统名称,例如“Linux”,“Windows” >>> platform. ...

  3. java-信息安全(八)-迪菲-赫尔曼(DH)密钥交换【不推荐,推荐Oakley】

    概述 信息安全基本概念: DH(Diffie–Hellman key exchange,迪菲-赫尔曼密钥交换) DH 是一种安全协议,,一种确保共享KEY安全穿越不安全网络的方法,它是OAKLEY的一 ...

  4. 机器学习理论基础学习3.4--- Linear classification 线性分类之Gaussian Discriminant Analysis高斯判别模型

    一.什么是高斯判别模型? 二.怎么求解参数?

  5. Django-form组件和ModelForm组件

    一. 构建Form表单 通过建一个类,添加需要进行验证的form字段,继而添加验证条件 from django import forms from django.forms import widget ...

  6. Android弹性滑动的三种实现方式

    引言 上一篇文章我们介绍了实现弹性滑动的三种方式,但仅仅是给出了代码片段和方法理论.今天我们结合一个具体的例子来谈一下如何使用这三种方法来实现弹性滑动.今天我们的例子是仿IOS的下拉操作,我们知道An ...

  7. html10

    1.动画fadeIn() - 淡入fadeOut() - 淡出 -通过改变透明度(opacity隐藏之后依旧占着位置)实现节点的显示和隐藏show() - 显示hide() - 隐藏 -同时改变节点的 ...

  8. C语言头文件、库文件的查找路径

    在 程序设计中,文件包含是很有用的.一个大的程序可以分为多个模块,由多个程序员分别编程.有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用.这样,可避免在每个 ...

  9. linux locate

    locate命令查找文件比find速度快很多,locate是在linux下实现快速查找文件的工具.相应的windows下有everything功能也很强大. [root@wuzhigang lib]# ...

  10. Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) C. Maximum splitting

    地址: 题目: C. Maximum splitting time limit per test 2 seconds memory limit per test 256 megabytes input ...