非spring-boot调用基于spring-cloud + zookeeper微服务 - 基础搭建

前言

SpringCloud 是个很好的微服务解决方案,对比于dubbo,组件更全面,适合多种应用场景。我在这就不一一赘述了。
由于服务于一家集团公司,采用微服务架构体系搭建服务体系没有任何问题,但是对于客户端来说spring-cloud仅提供基于spring-boot的使用,无论是Ribbon还是Feign都必须在Spring-Cloud体系内使用,但是老系统无法进行spring-could化改造,所以需要一个简单的通过API实现spring-could基于zookeeper的微服务访问。

实现涉及框架

1. spring-webmvc  RestTemplate

2. curator-x-discovery

3. spring-cloud-zookeeper-discovery    ZookeeperInstance


代码说明

1. 创建curator客户端用来访问zookeeper

CuratorFrameworkFactory.newClient(address, new ExponentialBackoffRetry(1000, 3));

2.通过curator获取ServiceInstance

public static ServiceInstance<ZookeeperInstance> getServiceInstance(String domainName) {

ServiceInstance<ZookeeperInstance> instance = null;

try {

CuratorFramework client = getCuratorClient();

        client.start();

       

        ServiceDiscover serviceDiscover = new ServiceDiscover(client, "services");

        serviceDiscover.start();

        ServiceProvider<ZookeeperInstance> serviceProvider = serviceDiscover.getServiceProvider(domainName);

       

        instance = serviceProvider.getInstance();

       

        return instance;

       

} catch (Exception e) {

e.printStackTrace();

}

 

return instance;

}

补充:serviceDiscover.getServiceProvider 可以设置service获取测试,本代码采用RoundRobinStrategy

   public ServiceProvider<ZookeeperInstance> getServiceProvider(String serviceName) throws Exception {

        ServiceProvider<ZookeeperInstance> provider = serviceProviderMap.get(serviceName);

        if (provider == null) {

            provider = serviceDiscovery.serviceProviderBuilder().

                    serviceName(serviceName).

                    providerStrategy(new RoundRobinStrategy<ZookeeperInstance>())

                    .build();


            ServiceProvider<ZookeeperInstance> oldProvider = serviceProviderMap.putIfAbsent(serviceName, provider);

            if (oldProvider != null) {

                provider = oldProvider;

            }else {

                provider.start();

            }

        }


        return provider;

    }


3.通过获取ServiceInstance来获取具体服务的ip以及端口信息

ServiceInstance<ZookeeperInstance> instance = ServiceHolder.getServiceInstance(DOMAIN_NAME);

String requestURL = "http://" + instance.getAddress() + ":" + instance.getPort() + "/" + serviceName;


此部分沿用了spring-cloud生成服务时采用的ZookeeperInstance作为payload。



后续研究

非基于spring-boot和annotation的微服务熔断/服务降级的实现-基于Hystrix


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值