前言

读者:对spring、spring boot有一定了解

难度:初中级,旨在快速应用于项目

参考文献:网络、书籍、官方文档,有任何错误欢迎大家留言拍砖指正

实战模拟源码:https://github.com/yhqnh/demo-springcloud,使用spring-cloud dalston版本


8.1.    服务治理

Spring-cloud-zookeeper提供的模式包括服务发现和配置,配置动态更新不需要手动请求/refresh端点。该项目通过自动配置并绑定到Spring环境和其他Spring编程模型成语,为Spring Boot应用程序提供Zookeeper集成。通过几个简单的注释,您可以快速启用和配置应用程序中的常见模式,并使用基于Zookeeper的组件构建大型分布式系统。FeignTurbineRibbonZuul均与Spring Cloud Zookeeper合作。

创建工程demo-springcloud-zookeeper,添加主要依赖spring-cloud-starter-zookeeper-config

启用服务治理功能,添加主要依赖spring-cloud-starter-zookeeper-discovery启用配置中心功能。顺带说一下添加依赖org.springframework.boot:spring-boot-configuration-processor是为了

启用Type-safe Configuration Properties

干货分享微服务spring-cloud(8.服务治理和配置中心spring-cloud-zk)_第1张图片

新建启动类ZookeeperApplication@EnableDiscoveryClient启用服务注册和发现,@EnableFeignClients启用feignClients,注意@FeignClient("demo-springcloud-zookeeper")这里的name要与spring.application.name相同,也即服务名。

@Configuration
@SpringBootApplication
@EnableDiscoveryClient
@RestController
@EnableFeignClients
public class ZookeeperApplication {

    @Value("${spring.application.name}")
    private String appName;

    @Autowired
    private LoadBalancerClient loadBalancer;

    @Autowired
    private DiscoveryClient discovery;

    @Autowired
    private Environment env;

    @Autowired
    private AppClient appClient;


    @Autowired
    private OwnerProperties ownerProperties;

    @RequestMapping("/")
    public ServiceInstance lb() {
        return this.loadBalancer.choose(this.appName);
    }

    @RequestMapping("/hi")
    public String hi() {
        return "Hello World! from " + this.discovery.getLocalServiceInstance();
    }

    @RequestMapping("/self")
    public String self() {
        return this.appClient.hi();
    }

    @RequestMapping("/getFromEnv")
    public String getFromEnv(@RequestParam("prop") String prop) {
        return new RelaxedPropertyResolver(this.env).getProperty(prop, "Not Found");
    }

    @RequestMapping("/getFromArchaius")
    public String getFromArchaius(@RequestParam("prop") String prop){
        return DynamicPropertyFactory.getInstance().getStringProperty(prop,"null").get();
    }

    @RequestMapping("/getFromConfigProperties")
    public String getFromConfigProperties(){
        return ownerProperties.getFirstName();
    }

    @FeignClient("demo-springcloud-zookeeper")
    interface AppClient {
        @RequestMapping(path = "/hi", method = RequestMethod.GET)
        String hi();
    }

    @Autowired
    RestTemplate rest;

    public String rt() {
        return this.rest.getForObject("http://" + this.appName + "/hi", String.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(ZookeeperApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate loadBalancedRestTemplate() {
        return new RestTemplate();
    }
}


配置文件application.properties配置spring.cloud.zookeeper.discovery.register开启注册服务,spring.cloud.zookeeper.config.enabled开启配置服务,spring.cloud.zookeeper.connectString

配置连接zk地址

image.png

启动zookeeper,启动应用,服务注册成功后位于zookeeper的services节点,get该节点查看数据验证是否成功注册服务

干货分享微服务spring-cloud(8.服务治理和配置中心spring-cloud-zk)_第2张图片

浏览器访问http://localhost:8080/self接口,通过feign客户端appClient访问绑定的自己提供的rest接口服务/hi

image.png

8.2.    配置中心

Zookeeper提供了一个分层命名空间,允许客户端存储任意数据,如配置数据。Spring Cloud Zookeeper ConfigConfig ServerClient的替代方案。在特殊的引导阶段,配置被加载到Spring环境中。默认情况下,配置存储在/config命名空间中。根据应用程序的名称和模拟解析属性的Spring Cloud Config顺序的活动配置文件,创建多个PropertySource实例。例如,名为“testApp”的应用程序和“dev”配置文件将创建以下属性源

config/testApp,dev
config/testApp
config/application,dev
config/application


Propertiesconfig/application命名空间适用于使用zookeeper进行配置的所有应用程序。config/testApp命名空间中的Properties仅适用于名为“testApp”的服务实例。

创建zk节点/config并配置子节点/test并设置值为“点融借款”和子节点person.first-name (person.firstName, person.first_name, PERSON_FIRST_NAME也可以)并设置值为“点融理财”

干货分享微服务spring-cloud(8.服务治理和配置中心spring-cloud-zk)_第3张图片

浏览器访问http://localhost:8080/getFromEnv?prop=test

干货分享微服务spring-cloud(8.服务治理和配置中心spring-cloud-zk)_第4张图片

浏览器访问http://localhost:8080/getFromConfigProperties

干货分享微服务spring-cloud(8.服务治理和配置中心spring-cloud-zk)_第5张图片