欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-22 21:21:47
...

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