Spring Cloud基于Zookeeper的微服务集群实现

  • Post author:
  • Post category:其他


Spring cloud集成了zookeeper得使用,通过服务端注册服务,客户端发现服务并使用轮询实现负载均衡,下面看具体的使用方法:


服务端的实现

1、pom文件需引入以下组件

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、application.yml配置文件内容:指定应用名称,以便在客户端调用服务使用

spring:

application:

name: zkserver

3、main方法的实现:

@Configuration
@EnableAutoConfiguration
@EnableDiscoveryClient
@RestController
public class ZkServerApp {

	@RequestMapping("/user")
	public Map<String,Object> info() {
		//模拟返回一个用户信息
		Map<String, Object> map = new HashMap<>();
		map.put("name", "john");
		map.put("age", 22);
		return map;
	}
	public static void main(String[] args) {
		SpringApplication.run(ZkServerApp.class, args);
	}
}


4、服务端启动:

默认端口为8080,可以通过—server.port指定启动端口,在本例中启动8080,8081,8082三个服务端口提供服务调用。


客户端的实现


1、pom文件需引入以下组件

客户端的依赖引入通服务端一致即可,同上

2、application.yml配置文件内容:

指定启动端口为8888,防止端口冲突

server:

port: 8888

同时将本服务的注册发现设置为false

spring:

cloud:

zookeeper:

discovery:

register: false

3、main方法的实现:

@SpringBootApplication
@RestController
@EnableDiscoveryClient
public class ZkClientApp {
	
	//获取服务端的应用名称
	@Value("${spring.application.name:zkserver}")
	private String appName;

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

	@Autowired
	private RestTemplate rt;

	@RequestMapping("/user")
	public String getUser() {
		System.out.println(loadBalance.choose(appName)); //打印当前调用的服务端地址
		@SuppressWarnings("unchecked")
		Map<String, Object> user = rt.getForObject("http://" + this.appName + "/user", Map.class);
		return user.toString();
	}

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

4、启动客户端,访问 http://localhost:8888/user,页面出现如下结果

{name=john, age=22},多次调用后控制台打印如下信息:

RibbonServer{serviceId=’zkserver’, server=windows10.microdone.cn:8080, secure=false, metadata={}}

RibbonServer{serviceId=’zkserver’, server=windows10.microdone.cn:8081, secure=false, metadata={}}

RibbonServer{serviceId=’zkserver’, server=windows10.microdone.cn:8082, secure=false, metadata={}}

RibbonServer{serviceId=’zkserver’, server=windows10.microdone.cn:8080, secure=false, metadata={}}

RibbonServer{serviceId=’zkserver’, server=windows10.microdone.cn:8081, secure=false, metadata={}}

RibbonServer{serviceId=’zkserver’, server=windows10.microdone.cn:8082, secure=false, metadata={}}

RibbonServer{serviceId=’zkserver’, server=windows10.microdone.cn:8080, secure=false, metadata={}}

RibbonServer{serviceId=’zkserver’, server=windows10.microdone.cn:8081, secure=false, metadata={}}

RibbonServer{serviceId=’zkserver’, server=windows10.microdone.cn:8082, secure=false, metadata={}}

完整代码地址:

https://github.com/hjguang/spring-cloud