SpringBoot日记——分布式篇
思考:什么是分布式?什么是微服务?
一些概念:RPC-远程过程调用,某台机器想要调用另一台机器所需要的一种服务,及分布式的服务框架,比如dubbo或者SpringCloud。
铺天盖地的分布式互联网系统,使用较多的是zookeeper+dubbo组合,而Springboot推荐使用全栈Spring,就是Springboot+SpringCloud。
举例说明一下基本原理:A想要获得数据B,但是有10台机器都可能存放了数据B,那么我要去哪台取数据B呢?A和B中间就有了一个管理站,这个管理站类似一个分配和注册中心,他可以告诉A想要的数据B在哪些机器里,A知道了以后就可以去这些机器里取了。同样B想要把自己数据分享给A,那么可以咨询这个管理站来知道可以分享给谁。
那么我们说的Dubbo或者SpringCloud就是上边说到的RPC服务框架,而Zookeeper和SpringBoot就可以作为这个管理站点来使用。
Zookeeper+Dubbo
官方看文档,或者网搜相关部署,比如:https://www.cnblogs.com/jaycekon/p/SpringBootDubbo.html
这篇文章主要以这个为主来讲,上边的自己看吧,有需要我再单独补文章~
SpringBoot+SpringCloud
Cloud与Dubbo的区别,Dubbo解决的就是远程过程调用的RPC服务,而Cloud更全面,它有一整套的分布式需要的对应的解决方案:配置管理、服务发现、熔断、路由、微代理、控制总线、一次性token、全局锁、leader选举、分布式session、集群状态。所以使用Cloud可以更快速的与云平台进行对接。
SpringCloud五大常用组件:
- 服务发现-Netflix Eureka
- 客服端负载均衡-Netflix Ribbon
- 断路器-Netflix Hystrix
- 服务网关-Netflix Zuul
- 分布式配置-SpringCloudConfig
那么我们来看SpringCloud怎么搞~
1)、配置-Eureka信息
首先我们创建几个需要用到的module,一个注册中心,一个服务提供方,一个服务使用方。然后在注册中心进行一下配置:

这里可以使用编译器中创建Spring Initializr的快捷模式

# 这里我使用了application.yml的配置,看起来会更清晰
server:
port: 8761 #启动端口
eureka:
instance:
hostname: eureka-server #eureka实例主机名-注册中心的名字
client:
register-with-eureka: false #不把自己注册到注册中心,因为本身就是作为注册中心的存在
fetch-registry: false #不从eureka上获取注册信息,同上
service-url:
defaultZone: http://localhost:8761/eureka #配置默认的启动路径
/**
* 注册中心
* EnableEurekaServer启动eureka服务
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication { public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
2)、启动主程序,打开浏览器测试一下(先看启动信息,已经启动了该服务):


2)、配置-provider信息
1.创建服务并将主程序启动(这是服务中心的服务不要停,也是在启动状态的),然后再来看服务已经注册进去了
import org.springframework.stereotype.Service; @Service
public class TicketService { public String getTicket() {
return "《大鲨鱼》";
}
}
service.TicketService
import com.ice.provider.service.TicketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class TicketController { @Autowired
TicketService ticketService; @GetMapping("/ticket")
public String getTicket() {
return ticketService.getTicket();
}
}
controller.TicketController
server:
port: 8001 #提供方的启动端口
spring:
application:
name: provider
eureka:
instance:
prefer-ip-address: true #注册服务的时候使用服务ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka
application.yml

2.来看,如果有多个应用呢?
修改一下server.port,一个8001,一个8002,分别打包启动。然后再来看注册中心里边(两个都在)


3)、配置-consumer信息
同样,先把自己注册到注册中心,然后创建个controller,并启动主程序,检查:
server:
port: 8200 #提供方的启动端口
spring:
application:
name: consumer
eureka:
instance:
prefer-ip-address: true #注册服务的时候使用服务ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka
application.yml
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate; @EnableDiscoveryClient // 开启发现服务
@SpringBootApplication
public class ConsumerApplication { public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
} @LoadBalanced // 启用负载均衡服务
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
ConsumerApplication
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; @RestController
public class UserController { @Autowired
RestTemplate restTemplate; @GetMapping("/buy")
public String buyTicket(String name) {
// 从注册中心获取提供方的信息,http://提供方应用的名字/路径,String类型
String s = restTemplate.getForObject("http://PROVIDER/ticket", String.class);
return name + "购买了" + s;
}
}
controller.UserController

如此,我们的分布式就说到这里,这么看,不是很难理解吧?
P.S:我们在上边有一个负载均衡的注解,哪里可以看来有什么作用呢?如果你启动了8001和8002的两个服务,可以通过启动窗口看到(我们有在两个服务中加入不同的打印语句),两个端口分别被调用,轮询式的均衡调用~
SpringBoot日记——分布式篇的更多相关文章
- SpringBoot日记——国际化篇
听起来高大上的国际化,起始就是在利用浏览器语言,或者页面中的中英文切换,将页面的文字在其他语言和中文进行切换,比如: 我们想让这个功能实现,点击中文,页面就是中文的,点击英文就是英文的. 国际化配置 ...
- SpringBoot日记——实战篇——Url定向
搞定了SpringBoot的一些基础核心的东西,我们需要实践一个项目来确认自己学习的东西能被应用,最初,我们会选择自己写一个登陆页面,这也是每个网站几乎都有的门面. 在写之前,还有一些知识点需要记录— ...
- JAVA复习笔记分布式篇:zookeeper
前言:终于到分布式篇,前面把JAVA的一些核心知识复习了一遍,也是一个JAVA程序员最基本要掌握的知识点,接下来分布式的知识点算是互联网行业的JAVA程序员必备的技能: 概念:ZooK ...
- SpringBoot第六篇:整合通用Mapper
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10876339.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 在以往的项 ...
- Redis分布式篇
Redis分布式篇 1 为什么 需要 Redis 集群 1.1 为什么需要集群? 1.1.1 性能 Redis 本身的 QPS 已经很高了,但是如果在一些并发量非常高的情况下,性能还是会受到影响. ...
- SpringBoot第七篇:整合Mybatis-Plus
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10881666.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 一看这个名 ...
- Springboot快速入门篇,图文并茂
Springboot快速入门篇,图文并茂 文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!搜索关注微信公众号 [码出Offer] 领取各种学习资料! image-20 ...
- springboot实现分布式锁(spring integration,redis)
Springboot实现分布式锁(Spring Integration+Redis) 一.在项目的pom.xml中添加相关依赖 1)Spring Integration依赖 <dependenc ...
- SpringBoot分布式篇Ⅷ --- 整合SpringCloud
SpringCloud是一个分布式的整体解决方案.Spring Cloud为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局锁,leader选举.分布 ...
随机推荐
- 自定义合并列:el-table
objectSpanMethod({ row, column, rowIndex, columnIndex }) {//合并规则 //当前行row.当前列column.当前行号rowIndex.当前列 ...
- Python之SGDRegressor
实现: # -*- coding: UTF-8 -*- import numpy as npfrom sklearn.linear_model import SGDRegressor __author ...
- [20180316]为什么不使用INDEX FULL SCAN (MIN/MAX).txt
[20180316]为什么不使用INDEX FULL SCAN (MIN/MAX).txt --//链接:http://www.itpub.net/thread-2100456-1-1.html.自己 ...
- [20171214]hashcat破解oracle口令.txt
[20171214]hashcat破解oracle口令.txt hashcat is the world's fastest and most advanced password recovery u ...
- Emacs中使用shell(调出terminal)
在Emacs中使用shell(调出terminal) 方法: M-x eshell 注意:不能使用 M-x shell,这样调用的是 cmd命令,一些命令无法使用
- Centos7使用Docker安装Gogs搭建git服务器
gihub地址:https://github.com/gogs/gogs gogs官网:https://gogs.io/ gihub官方docker安装gogs方法:https://github.co ...
- MDC的使用(Mapped Diagnostic Context)的使用
通常我们可能会有大量的任务需要提交提交到线程池执行,但是此时如果不对日志添加唯一标识进行区分的话回到错乱一坨无法进行查看.因此可以对每一天日志添加唯一的标识,例如使用userid作为日志的唯一标志.这 ...
- JS面向对象之工厂模式
js面向对象 什么是对象 "无序属性的集合,其属性可以包括基本值.对象或者函数",对象是一组没有特定顺序的的值.对象的没个属性或方法都有一个俄名字,每个名字都映射到一个值. 简单来 ...
- 转载 Net多线程编程—System.Threading.Tasks.Parallel
.Net多线程编程—System.Threading.Tasks.Parallel System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Paral ...
- day22 Pythonpython random随机模块:略!!!本文os模块
OS模块 用于提供系统级别的操作: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相 ...