前言
讀者:對spring、spring boot有一定了解
難度:初中級,旨在快速應用於項目
參考文獻:網絡、書籍、官方文檔,有任何錯誤歡迎大家留言拍磚指正
實戰模擬源碼:https://github.com/yhqnh/demo-springcloud,使用spring-cloud dalston版本
8.1. 服務治理
Spring-cloud-zookeeper提供的模式包括服務發現和配置,配置動態更新不需要手動請求/refresh端點。該項目通過自動配置並綁定到Spring環境和其他Spring編程模型成語,爲Spring Boot應用程序提供Zookeeper集成。通過幾個簡單的註釋,您可以快速啓用和配置應用程序中的常見模式,並使用基於Zookeeper的組件構建大型分佈式系統。Feign,Turbine,Ribbon和Zuul均與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
新建啓動類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地址
啓動zookeeper,啓動應用,服務註冊成功後位於zookeeper的services節點,get該節點查看數據驗證是否成功註冊服務
瀏覽器訪問http://localhost:8080/self接口,通過feign客戶端appClient訪問綁定的自己提供的rest接口服務/hi
8.2. 配置中心
Zookeeper提供了一個分層命名空間,允許客戶端存儲任意數據,如配置數據。Spring Cloud Zookeeper Config是Config Server和Client的替代方案。在特殊的“引導”階段,配置被加載到Spring環境中。默認情況下,配置存儲在/config命名空間中。根據應用程序的名稱和模擬解析屬性的Spring Cloud Config順序的活動配置文件,創建多個PropertySource實例。例如,名爲“testApp”的應用程序和“dev”配置文件將創建以下屬性源:
config/testApp,dev
config/testApp
config/application,dev
config/application
Properties是config/application命名空間適用於使用zookeeper進行配置的所有應用程序。config/testApp命名空間中的Properties僅適用於名爲“testApp”的服務實例。
創建zk節點/config並配置子節點/test並設置值爲“點融借款”和子節點person.first-name (person.firstName, person.first_name, PERSON_FIRST_NAME也可以)並設置值爲“點融理財”