非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 getServiceInstance(String domainName) {

ServiceInstance instance = null;

try {

CuratorFramework client = getCuratorClient();

        client.start();

       

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

        serviceDiscover.start();

        ServiceProvider serviceProvider = serviceDiscover.getServiceProvider(domainName);

       

        instance = serviceProvider.getInstance();

       

        return instance;

       

} catch (Exception e) {

e.printStackTrace();

}

 

return instance;

}

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

   public ServiceProvider getServiceProvider(String serviceName) throws Exception {

        ServiceProvider provider = serviceProviderMap.get(serviceName);

        if (provider == null) {

            provider = serviceDiscovery.serviceProviderBuilder().

                    serviceName(serviceName).

                    providerStrategy(new RoundRobinStrategy())

                    .build();


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

            if (oldProvider != null) {

                provider = oldProvider;

            }else {

                provider.start();

            }

        }


        return provider;

    }


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

ServiceInstance instance = ServiceHolder.getServiceInstance(DOMAIN_NAME);

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


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



后续研究

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


你可能感兴趣的:(非spring-boot调用基于spring-cloud + zookeeper微服务 - 基础搭建)