介绍:
在国内常用分布式是zookeeper+dubbo(阿里)组合,但springboot推荐使用的是springboot+springcloud的组合。
1.首先介绍springboot与zookeeper+dubbo的整合。
先在linux虚拟机中使用docker下载启动zookeeper容器(这里不详细说了,自己去学)
pom中引入两个依赖:
<!--引入dubbo--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.1.0</version> </dependency> <!--引入zookeeper的客户端工具--> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
在application.properties中写如下代码
dubbo.application.name=provider //配置提供者名字 dubbo.registry.address=zookeeper://192.168.43.11:2181 //配置注册中心 dubbo.scan.base-packages=com.wangjie.love.DaoImp //配置扫描包,找到包含@service的类
在你扫描包的路径下写入Dao和DaoImp
注意实现类上要有@Service(要发布那个实现类)这个@Service必须是dubbo的别导错包了。
然后启动服务器就可以将Provider发送到注册中心里。
我们再写一个消费者
我这里是两个Moudle
同样的现在pom中引入与Provider一样的依赖
在application.properties中写入
dubbo.application.name=consumer dubbo.registry.address=zookeeper://192.168.43.11:2181
这里你要是也想把消费的服务发送到注册中心你也可以写一个扫描包,这里我们快速整合就不写了。
然后写一个实现类
@Service public class UserService { @Reference TickerDao tickerDao; public void get(){ String ticket = tickerDao.getTicket(); System.out.println(ticket); } }
这里的@Service是我们正常的@Service。只是实例这个类而已。
在springboot测试类中写入:
@SpringBootTest class ConsumerUserApplicationTests { @Autowired UserService userService; @Test void contextLoads() { userService.get(); } 点击测试类显示结果:
得到结果,注意你要一直把Provider的服务启动着,你别把服务关了然后去获取,那肯定获取不到的。
2.我们接下来介绍Springboot+SpringCloud的快速整合
首先来看下项目结构:
有消费者、提供者、注册中心
在这里我们就可以关了zookeeper服务器了,不需要了。
首先来看注册中心的Moudle
他的application.properties配置:
server.port=8761 eureka.instance.hostname=eureka-servier #不会将自己注入到服务器中 eureka.client.register-with-eureka=false #不从eureka服务器上获取注册的信息 eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
我们再看看看启动类
@EnableEurekaServer 告诉我们这个Moudle是一个注册中心
然后我们启动项目访问http://localhost:8761/eureka/
看到了这个页面那么我们的注册中心就没有问题了
接下来看看Provider的Moudle
看看application.properties
server.port=8002 spring.application.name=provider-ticket #注册的时候使用服务的ip地址 eureka.instance.prefer-ip-address=true eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
其实这里可以不写eureka.client.service-url.defaultZone
因为在源码中我们可以看到
他默认就是我们配置的路径。
然后再写个Controller
@RestController public class TickerController { @Autowired TickerService tickerService; @GetMapping("/ticker") public String gettick(){ return tickerService.getTicker(); } }
之后启动Provider的启动类即可。
我们接下来再创建我们的消费者Module
先来看看他的application.properties
server.port=8200 spring.application.name=consumer #注册的时候使用服务的ip地址 eureka.instance.prefer-ip-address=true eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
只是修改了它的名字和端口
然后看看我们的启动类
再来看看我们的Controller类
@RestController public class userController { @Autowired RestTemplate restTemplate; @GetMapping("/buy") public String getTicker(String Name) { String s = restTemplate.getForObject("http://PROVIDER-TICKET/ticker", String.class); return Name+s; } }
这里我们是通过RestTemplate模板类对其他项目进行访问的。
然后启动消费类
若是均启动成功我们可以看到
这样的画面。
这个时候我们访问消费者的Controller
可以看到
成功访问到了其他项目的Controller返回的数据。
若是想试验负载均衡那么可以这样做:
点击项目的package打包成jar包
通过修改端口号8001和8002进行访问体验负载均衡。
如上看到启动了两个8001和8002端口的provider。注意(要先启动你们的Server然后在启动jar包项目)
启动我们的消费者
我们访问三次Controller的结果:
我们就可以知道他的访问不会一直都在一个项目上访问,而是均匀的访问,每个项目访问一次,若是学过nigunx的肯定对这个很了解,这里也不多说了。
这次的介绍就到此为止了下次再见。