文章目录
情况简述
狂神说SpringBoot17:Dubbo和Zookeeper集成_狂神说-优快云博客
我跟着上面的文章做了一下,成功实现了。下面打包的是根据上面那个文章,配置好的dubbo-admin和zookeeper和文章里的SpringBoot + Dubbo + zookeeper的整合小项目。没要积分,免费。想测试的可以下载下来测试一下。
狂神说SpringBoot17:Dubbo和Zookeeper集成.zip-Java文档类资源-优快云下载
测试步骤:
——>导入项目到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监控中心监测到)
Consumer向Registry来subscribe,用@Test的方式来执行时,不会被 Dubbo Admin(http://localhost:7001/) 监测到,只有用main方法(如下)来执行时,才能被监测到。
public static void main(String[] args) {
SpringApplication.run(ConsumerServerApplication.class, args);
userService2.bugTicket();
}
监测到:
发现二(@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地址,并且能够平滑添加或删除服务提供者。