そして、伝統的なSSMの統合 - XML設定ファイルを書きます
長距離通話サービスプロバイダを達成するためのアプリケーション間で、サービスプロバイダとサービスコンシューマ、コンシューマーサービスを構築します
公共抽出モジュール
- 公共抽出モジュール
消費者サービスの長距離通話サービスプロバイダクラスタが倍増する場合は、少なくとも彼は、サービスプロバイダでサービスを提供するために、クラスの参照、消費者と1のサービス1を取得する必要があり、その抽出公衆公共の使用のためのモジュール、ストレージ・クラスとインタフェース
サービスプロバイダ
- 頼ります
// 自定义的公共模块
<dependency>
<groupId>com.changwu</groupId>
<artifactId>commom</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.3</version>
</dependency>
- サービスビジネスサービス、インタフェースの特定の実装を書きます
public class UserServiceImpl implements UserService {
public List<UserAddress> getUserAddressList() {
UserAddress a1= new UserAddress(1,"张三","北京市朝阳区");
UserAddress a2= new UserAddress(2,"李四","山东济南");
return Arrays.asList(a1,a2);
}
}
- 設定ファイルの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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 暴露服务提供者, name=服务名(不能和其他服务名重复) -->
<dubbo:application name="user-service-provider" />
<!-- z指定zookeeper的地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 指定通信规则,通信协议, 通信端口. 服务消费者和dubbo之间的通信-->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 ref=服务的真正实现, 下面使用<bean>调用-->
<dubbo:service interface="com.changwu.service.UserService" ref="userService" />
<!-- 接口的实现 -->
<bean id="userService" class="com.changwu.service.impl.UserServiceImpl" />
<dubbo:monitor protocol="registry"></dubbo:monitor>
</beans>
手動設定のスキーマを参照し、[すべてのタブをクリックし、詳細な説明
追加:プロパティの設定には、優先順位をカバーするために書き直さ
- あなたは-Dパラメータを使用して起動すると、最も高い優先度のJVMを設定します
- 続く、dubbo.xml
- 再びdubbo.properties
以下は、典型的なサンプルの構成dubbo.propertiesです。
dubbo.application.name=foo
dubbo.application.owner=bar
dubbo.registry.address=10.20.153.10:9090
- 仮想マシンの起動パラメータを設定するためのアイデア
- log4jの設定ファイル(警告を追加しない場合)
###set log levels###
log4j.rootLogger=info, stdout
###output to console###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n
消費者サービス
- 頼ります
// 自定义的公共模块
<dependency>
<groupId>com.changwu</groupId>
<artifactId>commom</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
// zk的客户端依赖 curator
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
</dependency>
- consumer.xmlを書きます
、独自のサービスプロファイルの名前を書くのアドレスレジストリを設定した後、レジストリにサービスのリストを引き出し、リモートRPCコールによって実装されるインターフェイスを使用する消費者の現在の構成は、あなたもサービスを参照するには、監視センターを構成することができます健康、スキャンパッケージを設定する必要が春の注釈を使用することを忘れないでください、お互いの状況を呼び出します
<?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://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="order-service" />
<!--注册中心地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用 userService -->
<dubbo:reference id="userService" interface="com.changwu.service.UserService" />
<!--添加包扫描-->
<context:component-scan base-package="com.changwu"></context:component-scan>
<!--配置监控中心,有下面两种方式 1. 去注册中心自动发现, 2. 直连模式-->
<dubbo:monitor protocol="registry"></dubbo:monitor>
<!-- <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor>-->
</beans>
- 消費者は、実装するサービスプロバイダを呼び出す
ネイティブの春を使用して、以下の注意事項を@Service
@Service // 没有用dubbo的service注解
public class OrderServiceImpl implements OrderService {
@Autowired
UserService userService;
public List initOrder(String userId) {
// 查询用户的地址
System.out.println("userId == "+userId);
List<UserAddress> userAddressList = userService.getUserAddressList("1");
for (UserAddress userAddress : userAddressList) {
System.out.println(userAddress.getAdress());
}
return userAddressList;
}
}
- テストを開始
public class MainApp {
public static void main(String[] args) {
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("consumer.xml");
OrderService orderService = ioc.getBean(OrderService.class);
orderService.initOrder("1");
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
統合Springboot
パブリックモジュール
また内のクラス、インターフェースを再利用し、他のモジュールで参照
サービスプロバイダ
- 頼ります
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.changwu</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--
dubbo整合进springboot
zookeeper,curate它都已经导入进来了
-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
- provider.xmlのapplication.propertiesを置き換えるために、設定ファイル
使用して、タグや属性名を組み合わせることが可能なXML「」区切り。1行に1つの属性
# 指定当前的服务, 一般为了防止重复,设置成当前module的名字
dubbo.application.name=provider
# 指定注册中心的地址
dubbo.registry.address=127.0.0.1:2181
dubbo.registry.protocol=zookeeper
# dubbo 使用的协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
# 原配置文件中暴露服务的名字,使用类似下面的方式,但是在SpringBoot中使用 @Service注解(dubbo的)
# dubbo.service.interface=com.changwu.service.UserService
# 监控中心
dubbo.monitor.protocol=registry
server.port=8082
- 達成するためのサービスプロバイダインタフェース
ダボ@Serviceの使用インタフェースを
@Component
@Service //使用dubbo的Service 对外保留服务
public class UserServiceImpl implements UserService {
public List<UserAddress> getUserAddressList(String userId) {
UserAddress a1= new UserAddress(1,"张三","北京市朝阳区");
UserAddress a2= new UserAddress(2,"李四","山东济南");
return Arrays.asList(a1,a2);
}
}
- クラスを起動し、オープンダボ構成
@EnableDubbo
@SpringBootApplication
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class);
}
}
消費者サービス
- 頼ります
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.changwu</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
- application.propertiesプロファイル交換consumer.xmlを使用します
# 告诉注册中心自己的名字
dubbo.application.name=consumer
# 注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 配置监控中心
dubbo.monitor.protocol=registry
# 原来在配置文件中使用 dubbo:reference 配置远程调用的接口,现在用注解
server.port=8081
- リモートコールダボコメント@Reference
@Service
public class OrderServiceImpl implements OrderService{
//@Autowired
@Reference // dubbo的注解
UserService userService;
public List<UserAddress> initOrder(String userId) {
return userService.getUserAddressList("1");
}
}
- 書かれたコントローラ
- クラスを起動し、オープンダボ構成
@EnableDubbo
@SpringBootApplication
public class MainApp {
public static void main(String[] args) {
SpringApplication.run(MainApp.class);
}
}
その他の一般的な構成
例は、一般的な構成例をダボ
チェックを開始
スタートの消費者サービスは、彼らはリモートコールサービスがレジストリに登録されている必要かどうかをチェックするために起こっている、一度レジストリにチェックインエラーが自動的に起動しないと春を停止します場合でも、このメソッドを呼び出すために確認せず、開発に、手動でこの設定をオフにするかを選択できます
- 設定ファイル
配置某个服务启动时检查
在服务消费者中,关闭某个服务的启动时检查 (没有提供者时报错):
<dubbo:reference interface="com.foo.BarService" check="false" />
统一配置全部服务启动时不检查
关闭所有服务的启动时检查 (没有提供者时报错):
<dubbo:consumer check="false" />
默认是true. 表示注册中心不存在时报错
关闭注册中心启动时检查 (注册订阅失败时报错):
<dubbo:registry check="false" />
- dubbo.propertiesにより、
dubbo.reference.com.foo.BarService.check=false
dubbo.reference.check=false
dubbo.consumer.check=false
dubbo.registry.check=false
- JVMパラメータによって
java -Ddubbo.reference.com.foo.BarService.check=false
java -Ddubbo.reference.check=false
java -Ddubbo.consumer.check=false
java -Ddubbo.registry.check=false
タイムアウト設定
消費者の長距離電話サービスプロバイダは、サービスプロバイダーは、タイムアウトがこの問題を解決するために設定し、この方法でブロックされたスレッドがたくさんある可能性があり、ロジックは時間のかかる作業の多くがあるかもしれません実現、一度指定した時間内にまだすべてのデータを返しませんでした、それが可能なシステムを確保するために、すぐに戻ります
デフォルト
以下は、3秒にタイムアウトを設定
<!-- 生成远程服务代理,可以和本地bean一样使用 userService -->
<dubbo:reference id="userService" interface="com.changwu.service.UserService" timeout="3000"/>
上記の図から、私は自分の役割をマークし、最高の優先度はメソッドレベルで、最低のグローバルレベル続いインターフェース、 -消費者のセットの優先順位の同じレベルは、プロバイダの設定に従っ
再試行
一般的なタイムアウトの設定タイムアウトと再試行回数は、連携を再試行します
呼び出しが失敗した後、それはリトライリモート呼び出しの数に応じて、再試行します、我々は4回まで呼び出そうと、初めてカウント、3を設定した場合、再試行の回数は、最初に含まれていません。
サービスプロバイダが存在する場合クラスタは、クラスタのポーリング消費者が再試行されます
- 冪等倍
- クエリ、削除、変更(同じ要求することを特徴と、同じパラメータに関係なく何回実行、結果は同じである)、リトライ回数を設定します
- 非冪等
- 追加されたが、数が冪等、リトライ= 0を提供されていません
<!-- 生成远程服务代理,可以和本地bean一样使用 userService -->
<dubbo:reference id="userService" interface="com.changwu.service.UserService" retries="3" timeout="3000"/>
複数のバージョン
私たちは、システムのアップグレードの機能のいくつかを与えるが、アップグレードコードは、クラスタ内のすべてのマシンに適用された後、一度にすべてを置くことができない、いや、マルチバージョン管理、アップグレードするマシンの最初のクラスタのごく一部その後、徐々に最終完成はすべて置き換え、現象の規模を拡大できません
古いとすべてのサービスプロバイダの新バージョンは、同じインターフェイスの継承com.foo.BarServiceを別の実現ビーンへの参照ポイントで、
老版本服务提供者配置:
<dubbo:service interface="com.foo.BarService" version="1.0.0" ref="userService1" />
<bean id="userService1" class="xxx">
新版本服务提供者配置:
<dubbo:service interface="com.foo.BarService" version="2.0.0" ref="userService2"/>
<bean id="userService2" class="yyy">
老版本服务消费者配置:
<dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />
新版本服务消费者配置:
<dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />
如果不需要区分版本,可以按照以下的方式配置 [1]:
<dubbo:reference id="barService" interface="com.foo.BarService" version="*" />
ローカルスタブ
次のようなパラメータを確認するために、リモートプロシージャコールその他の方法に先立って、消費者のサービスに送信する場合は、治療を宣告空、ローカルスタブを使用するように選択することができます
このようなUserServiceのは、次のように消費者は、リモートサービスを呼び出し、サービスプロバイダ実装である、として、消費者がローカルで独自の実装を提供し、合法性のパラメータを決定
public class UserServiceImpl implements UserService{
// 注入这个被服务提供者支持的接口
private final UserService userService;
// 提供构造函数
public UserServiceImpl(UserService userService) {
this.userService = userService;
}
@Override
public List<UserAddress> getUserAddressList(String userId) {
// 判空
if (!StringUtils.isEmpty(userId)){
return userService.getUserAddressList(userId);
}
return null;
}
}
- プロファイル
在 spring 配置文件中按以下方式配置:
# 是消费者在本地自己的实现 com.changwu.service.UserServiceImpl
<dubbo:service interface="com.changwu.service.UserServiceImpl" stub="true" />
或
<dubbo:service interface="com.foo.BarService" stub="com.changwu.service.UserServiceImpl" />
3つの方法のダボとSpringBoot統合
方法1
- ダボ・スターターを導入
- 使用@EnableDubbo(スキャンルール指定されたパッケージ)は、メインクラスに配置されました
- application.propertiesで構成プロパティ
- サービスプロバイダー:@Serviceを使用してサービスを公開
- コンシューマーサービス:使用@Referenceリファレンスサービス
方法2
あなたは、このようなメソッドレベルの設定として、追加したい場合は、dubboxmlプロファイルを残します
- 起動クラスに@EnableDubboノートを削除
- ( ":プロバイダ/ consumer.xmlクラスパス" localtion =)起動クラスに@ImportResourceを追加
- Application.propertiesは、関連する構成ダボを削除します
- サービスプロバイダは、provider.xmlのプロファイルを使用します
- 消費者サービスはconsumer.xmlプロファイルです
方法3 Notes構成
2.6.3は、ダボを必要とします