学习狂神说的SpringBoot + Dubbo + zookeeper的发现

文章目录

  • 情况简述
      • 测试步骤:
  • 发现一(用@Test运行不会被Dubbo监控中心监测到)
  • 发现二(@Autowired和static的关系)
      • 方法一(将@Autowire加到构造方法上):
      • 方法二(用@PostConstruct注解):
        • 通过打断点调试,发现下方代码流程如下:
  • 参考
  • 最后


情况简述

狂神说SpringBoot17:Dubbo和Zookeeper集成_狂神说-CSDN博客

我跟着上面的文章做了一下,成功实现了。下面打包的是根据上面那个文章,配置好的dubbo-admin和zookeeper和文章里的SpringBoot + Dubbo + zookeeper的整合小项目。没要积分,免费。想测试的可以下载下来测试一下。
狂神说SpringBoot17:Dubbo和Zookeeper集成.zip-Java文档类资源-CSDN下载

测试步骤:

——>导入项目到IDEA
——>双击运行zkServer.cmd
——>命令行来到dubbo-admin-0.0.1-SNAPSHOT.jar所在的目录,输入 “java -jar dubbo-admin-0.0.1-SNAPSHOT.jar” 运行dubbo-admin-0.0.1-SNAPSHOT.jar
——>浏览器打开Dubbo Admin(http://localhost:7001/)

——>在IDEA中运行ProviderServerApplication类的main方法
——>在IDEA中运行ConsumerServerApplication类的main方法
——>刷新网页,观察Dubbo Admin网页中的服务治理的提供者和消费者。


发现一(用@Test运行不会被Dubbo监控中心监测到)

学习狂神说的SpringBoot + Dubbo + zookeeper的发现_第1张图片

Consumer向Registry来subscribe,用@Test的方式来执行时,不会被 Dubbo Admin(http://localhost:7001/) 监测到,只有用main方法(如下)来执行时,才能被监测到。

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

监测到:
学习狂神说的SpringBoot + Dubbo + zookeeper的发现_第2张图片

发现二(@Autowired和static的关系)

因为main方法是static的,main方法里面的变量也要是static的,但如果直接把用@Autowired注入的变量userService改为static,运行main方法会产生java.lang.NullPointerException异常。

而如果另外定义一个static变量userService2,然后在构造器里给userService2赋值,即userService2=userService;,然后在main方法里写userService2.bugTicket();,此时依然会产生java.lang.NullPointerException异常。

@Autowired和static的关系 - 左手程序,右手诗 - 博客园 这篇文章给出的两种方法都能解决这个问题。

我用这篇给文章的两个方法解决我的问题,代码如下:


方法一(将@Autowire加到构造方法上):

package com.kuang;

import com.kuang.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConsumerServerApplication {

	static UserService userService;

	@Autowired
	ConsumerServerApplication(UserService userService){
		ConsumerServerApplication.userService=userService;
		System.out.println("构造器");
	}

	public static void main(String[] args) {
		System.out.println("main()_run()_前");
		SpringApplication.run(ConsumerServerApplication.class, args);
		System.out.println("main()_run()_后");
		userService.bugTicket();
	}
}

输出如下:

main()_run()_前
构造器
main()_run()_后
在注册中心买到《狂神说Java》

方法二(用@PostConstruct注解):

通过打断点调试,发现下方代码流程如下:

——>main()方法里的SpringApplication.run(ConsumerServerApplication.class, args);
——>构造器ConsumerServerApplication()
——>自动注入@Autowired
——>用@PostConstruct注解的setUserService()
——>main()方法里的userService2.bugTicket();

package com.kuang;

import com.kuang.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.annotation.PostConstruct;

@SpringBootApplication
public class ConsumerServerApplication {

	@Autowired
	UserService userService;

	static UserService userService2;

	ConsumerServerApplication(){
		//userService2=userService;
		System.out.println("构造器");
	}

	@PostConstruct
	public void setUserService(){
		userService2=userService;
		System.out.println("构造器后");
	}

	public static void main(String[] args) {
		System.out.println("main()_run()_前");
		SpringApplication.run(ConsumerServerApplication.class, args);
		System.out.println("main()_run()_后");
		userService2.bugTicket();
	}
}

输出如下:

main()_run()_前
构造器
构造器后
main()_run()_后
在注册中心买到《狂神说Java》

参考

dubbo与zookeeper的关系 - HolleJava-Like - 博客园
Dubbo建议使用Zookeeper作为服务的注册中心。
Dubbo能做什么?
透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

最后

学习狂神说的SpringBoot + Dubbo + zookeeper的发现_第3张图片

你可能感兴趣的:(java,spring,boot,dubbo,zookeeper,idea)