Skip to content
neoremind edited this page Aug 8, 2015 · 7 revisions

配置说明

1 注册中心zookeeper全局配置

主要介绍rpc-server.properties和rpc-client.properties中公共部分的配置。

属性 可选值 作用
ENABLE_ZK_REGISTRY true:启动,默认。false:不启用 是否启用注册中心。对于服务端来说如果为true则在服务启动去zookeeper注册服务,否则不进行注册。对于客户端来说如果为true,则远程服务的地址从zookeeper上取,否则采用直连方式
ZK_SERVER_LIST 例如,10.48.56.33:8701,10.48.52.17:8701 zookeeper服务器地址列表,带端口号,按逗号分隔
ZK_DEFAULT_SESSION_TIMEOUT_MILLS Int值,例如10000 zookeeper seesion timeout,采用毫秒单位,当服务拿掉时,间隔该参数毫秒后会通知客户端
ZK_CONNECTION_TIMEOUT_MILLS Int值,例如30000 启动zookeeper连接时的timeout,采用毫秒单位,超过这个时间则报错连接失败
ZK_DIGEST_AUTH String值,例如Abc123 zookeeper访问控制digest密串,留空表示不启用访问控制

2 服务提供者配置

主要介绍rpc-server.properties配置,省略1小节已经介绍的部分。

属性 可选值 作用
ZK_REGISTRY_NAMESPACE 例如,/my-service/main 启用zookeeper注册后的服务注册的命名空间,即appnamespace。Znode path节点数量1-N均可,只需要在客户端定义的ZK_WATCH_NAMESPACE_PATHS指定正确即可。
SERVER_PORT 例如,8080 服务器HTTP端口,由于需要在服务启动时就注册在,因此该变量需要提前设好,该端口是作为发布到zookeeper的port使用的。

3 服务消费者配置

主要介绍rpc-client.properties配置,省略1小节已经介绍的部分。

属性 可选值 作用
ZK_WATCH_NAMESPACE_PATHS 例如,/my-service/main, /my-service/exp 客户端订阅zookeeper的path列表,按逗号分隔。当这里定义的path znode发生更新时,将会触发通知,更新客户端本地的服务地址cache。
SERVER_LIST 例如,10.48.56.33:8080,10.48.52.17:8080 zookeeper服务器地址列表,带端口号,按逗号分隔。
RPC_CONNECTION_TIMEOUT Int值,例如900000 连接超时时间,采用毫秒单位。
RPC_READ_TIMEOUT Int值,例如900000 读超时时间,采用毫秒单位。
RPC_RETRY_TIMES Int值,例如2 重试次数,仅当错误处理方式为FAILOVER时才有意义,表示重试的次数。

4 maven编译出sdk jar配置

一般来说,服务端需要依赖服务端暴露的sdk jar,以最小依赖原则进行模块对调用封闭,只暴露VO/BO/接口定义等。 具体来说在maven的pom中加入如下配置:

<build>
    <defaultGoal>package</defaultGoal>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <id>make-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <finalName>${YOUR_SERVICE_NAME.dep.name}</finalName>
                        <includes>
                            <!-- 指定需要export到sdk jar的类,包括VO/BO/POJO,service接口和expcetion异常类等-->
                            <include>**/vo/*</include>
                            <include>**/bo/*</include>
                            <include>**/*Mgr.class</include>
                            <include>**/*Service.class</include>
                        </includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <tarLongFileMode>gnu</tarLongFileMode>
            </configuration>
            <executions>
                <execution>
                    <id>make-tar.gz</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <descriptors>
                            <descriptor>package-tar.gz.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- override maven-install-plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                    <id>default-install</id>
                    <phase>none</phase>
                </execution>
                <execution>
                    <id>install YOUR_SERVICE_NAME</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <finalName>${YOUR_SERVICE_NAME.dep.name}</finalName>
                        <file>${project.build.directory}/${YOUR_SERVICE_NAME.dep.name}.jar</file>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${YOUR_SERVICE_NAME.dep.name}</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- override maven-deploy-plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <executions>
                <execution>
                    <id>default-deploy</id>
                    <phase>none</phase>
                </execution>
                <execution>
                    <id>deploy YOUR_SERVICE_NAME</id>
                    <phase>deploy</phase>
                    <goals>
                        <goal>deploy-file</goal>
                    </goals>
                    <configuration>
                        <!--===============================================================================-->
                        <!-- WARN: Switch the config when dealing with maven's main repo and snapshot rep  -->
                        <!--===============================================================================-->
                        <!--
                        <repositoryId>${baidu.deploy.repository.id}</repositoryId>
                        <url>${baidu.deploy.repository.url}</url>
                        <file>${project.build.directory}/${YOUR_SERVICE_NAME.dep.name}.jar</file> 
                        -->
                         
                        <repositoryId>Baidu_Local_Snapshots</repositoryId>
                        <url>http://maven.scm.baidu.com:8081/nexus/content/repositories/Baidu_Local_Snapshots</url>
                        <file>${project.build.directory}/${YOUR_SERVICE_NAME.dep.name}.jar</file>
                         
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${YOUR_SERVICE_NAME.dep.name}</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                        <retryFailedDeploymentCount>3</retryFailedDeploymentCount>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

注意:

  1. ${YOUR_SERVICE_NAME.dep.name}需要替换为服务的名称,例如xxx-service-sdk。因此在target或者maven仓库中会出现xxx-service-sdk.jar以及xxx-service.war(或者tar.gz)两个模块。
  2. 在开发编译SNAPSHOT版本时,请注意deploy配置中的“”部分进行main仓库和snapshot仓库的切换,一旦编译上传main仓库便无法覆盖,snapshot仓库可以随意覆盖。 暴露的VO/BO如果还依赖了一些第三方jar,那么这些依赖的jar也是需要加入到客户端的,否则会再运行时报错Class Not Found。

5 服务消费者序列化协议配置

主要介绍在applicationContext.xml或者注解方式配置代理bean的参数NaviProtocol的定义。

一个完整的例子,

@Bean
	public CompanyMgr companyMgr() throws Exception {
		return (CompanyMgr) (new NaviProxyFactoryBean("/navi-demo-server/main/", CompanyMgr.class, NaviProtocol.PROTOSTUFF, NaviFailStrategy.FAILOVER, NaviSelectorStrategy.RANDOM).getObject());
	}
可选值 作用
PROTOSTUFF 默认,采用Protostuff序列化协议
PROTOBUF 采用Protobuf序列化协议
JSON 采用Json序列化协议,使用jackson json

6 服务消费者容错策略配置

主要介绍在applicationContext.xml或者注解方式配置代理bean的参数NaviFailStrategy的定义。

一个完整的例子,

@Bean
	public CompanyMgr companyMgr() throws Exception {
		return (CompanyMgr) (new NaviProxyFactoryBean("/navi-demo-server/main/", CompanyMgr.class, NaviProtocol.PROTOSTUFF, NaviFailStrategy.FAILOVER, NaviSelectorStrategy.RANDOM).getObject());
	}

可选值 作用
FAILOVER 默认,失败自动切换,当出现失败,重试其它服务器,通常用于读操作(推荐使用)。重试会带来更长延迟,可通过RPC_RETRY_TIMES =2来设置重试次数(不含第一次)。
FAILFAST 快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作

7 服务消费者软负载均衡配置

主要介绍在applicationContext.xml或者注解方式配置代理bean的参数NaviSelectorStrategy的定义。

一个完整的例子,

@Bean
	public CompanyMgr companyMgr() throws Exception {
		return (CompanyMgr) (new NaviProxyFactoryBean("/navi-demo-server/main/", CompanyMgr.class, NaviProtocol.PROTOSTUFF, NaviFailStrategy.FAILOVER, NaviSelectorStrategy.RANDOM).getObject());
	}
可选值 作用
RANDOM 默认,随机,按随机概率(推荐使用)
ROUNDROBIN 轮循,存在慢的机器累积请求问题,极端情况可能产生雪崩,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
NATURALORDER 按照节点在zk或者配置的顺序

8 异常传递

服务器端可以将异常直接打包到sdk中,如果服务端抛出异常,客户端可以直接try-catch到该异常。 如下所示,服务端代码:

/**
 * add
 */
public Company add(Company company) {
    if (companyMap.containsKey(company.getId())) {
        throw new IdDuplicateException("Company id deplicate");
    }
    companyMap.put(company.getId(), company);
    companyList.add(company);
    return company;
}

定义异常:

/**
 *
 * ClassName: IdDuplicateException <br/>
 * Function: ID重复异常
 *
 * @author zhangxu04
 */
public class IdDuplicateException extends RuntimeException {
    private static final long serialVersionUID = -6138595796119511714L;
    public IdDuplicateException() {
    }
    public IdDuplicateException(String message, Throwable cause) {
        super(message, cause);
    }
    public IdDuplicateException(String message) {
        super(message);
    }
    public IdDuplicateException(Throwable cause) {
        super(cause);
    }
}

那么,客户端可以直接使用:

    try {
        Company result = companyMgr.add(company);
        System.out.println(result);
    } catch (IdDuplicateException e) {
        e.printStackTrace();
    }