从零开始构建服务注册-概述

服务注册框架包含客户端内容,服务端内容。

客户端一般轮训远程,拿到最新的服务注册的信息。某个服务注册的返回信息一般如下

{
    "clusterName": "xxxxxx",//目标服务名
    "endpoints": [
        {
            "locality": {
 				//这里是一些服务注册返回的校验值
            },
            "lbEndpoints": [
                {
                    "endpoint": {
                        "address": {
                            "socketAddress": {
                                "address": "xxx",
                                "portValue": 1234
                            }
                        }
                    },
                    "metadata": {
                        "filterMetadata": {
                            "Tags": {
                                "appid": "xxx",
                                "hostname": "xxxx",
                                "lane": "xxxx",
                                "shard": null,
                                "weight": 100
                            }
                        }
                    },
                    "loadBalancingWeight": 100
                },

客户端

客户端初始化

在Spring配置文件中初始化自己的lifebean

	<bean id="consumerLifeBean" class="com.umetrip.register.domain.ConsumerLifeBean" lazy-init="false" >
	</bean>

同时被配置的还有HttpInvokerRequestExecutor,你可以使用spring自带的,也可以自己实现,比如加上Hystrix的功能。使用httpclient进行网络通信,你可以对其设置一些参数。

	<bean  id="springHttpInvokerRequestExecutor"
		   class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">
		<property name="httpClient" ref="httpclient" />
	</bean>

同时还有listener,在context初始化时候添加,用于完成在zookeeper上的注册。

	<listener>
		<listener-class>xxx.common.listener.ConsumerStartUpSubListener</listener-class>
	</listener>

服务发现

    public ServiceInstance<InstanceDetails> getInstanceByName(String serviceName) throws Exception {
        ServiceProvider<InstanceDetails> provider = providers.get(serviceName);
        if (provider == null) {
            synchronized (lock) {
                provider = providers.get(serviceName);
                if (provider == null) {
                    provider = serviceDiscovery.serviceProviderBuilder().
                            serviceName(serviceName).
                            providerStrategy(new RandomStrategy<InstanceDetails>())
                            .build();
                    provider.start();
                    closeableList.add(provider);
                    providers.put(serviceName, provider);
                }
            }
        }
        return provider.getInstance();
    }

监听服务变更事件

#服务端
##服务端初始化
在spring配置文件中配置自己的lifebean。

	<bean id="serviceLifeBean" class="xxx.register.domain.LifeBean" lazy-init="false" >
		<property name="providerMark" value="${providerMark}"></property>
		<property name="providerPort" value="${providerPort}"></property>
	</bean>

同时被配置的还有自己的心跳服务

	<bean name="/serviceHeartbeat"
		class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
		<property name="service" ref="heartBeatSVC" />
		<property name="serviceInterface" value="xxx.register.heartbeat.IHeartBeatSVC" />
	</bean>

##配置filter
在web.xml中部分代码

	<filter>
		<filter-name>catLogFilter</filter-name>
		<filter-class>xxx.filter.UnityAccessFilter</filter-class>
	</filter>

UnityAccessFilter类部分代码

    @Override
    public void init(FilterConfig config) throws ServletException {
        Filter ipFilter = new IpFilter();
        ipFilter.init(config);
        filters.put(new Pattern("/*"), ipFilter);
    }

除了过滤IP,还可以利用filter进行访问打点,日志追踪和Hystrix。

#其他

###分布式锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值