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选举.分布 ...
随机推荐
- C# JObject和JArray 的分享
最近在调用别人的搜索引擎接口时遇到了一种返回类型为数组的情况,如 { "result": [ //根据用户输入搜索匹配到的标题数组 "我是一条新 ...
- linux 下的ssh
ssh服务 1.检查是否有被安装,命令 rpm -qa|grep "ssh" 2.检查ssh有没有在运行,命令 rpm -qa|grep "ssh" 3.如何启 ...
- Java新建Web应用与配置Tomcat流程
1. 新版本IDEA新建Web应用后没有web.xml文件,需要通过下图方式添加 2. IDEA中的web文件夹相当于eclipse里的WebRoot文件夹,在里面新建WEB-INF文件夹,再创建cl ...
- [20170615]执行dbms_sqldiag.dump_trace看执行计划.txt
[20170615]执行dbms_sqldiag.dump_trace看执行计划.txt --//上午在想查看10053执行计划时使用包时出现如下提示: SCOTT@book> @ &r ...
- django模板语言之Template
当前端的一些数据需要后端传送过来并展示时,用到了django的模板语言,模板语言的作用就是,在后端把一些处理好的数据,通过模板语言所规定的格式,通过render渲染,放到前端页面固定的位置展示.这之间 ...
- java 基础one ---运算符and流程控制
首先java这个了解下java的基础 首先java文件都是以.java结尾的 然后 他所有的内容都是有一个入口的就是放在了public static void main(String [] args ...
- Arch Linux 更新源(以清华 arch 源为例)
Arch Linux 编辑/etc/pacman.d/mirrorlist,在文件最顶端添加: Server = https://mirrors.tuna.tsinghua.edu.cn/archl ...
- 第五章 绘图基础(LINEDEMO)
LINEDEMO程序绘制一个矩形.两条直线.一个椭圆和一个圆角矩形.该程序表明,定义了封闭矩形的这些函数确实对这些区域进行了填充,因为椭圆后面的线被隐藏了. /*------------------- ...
- qlexpress
qlexpress也是一个用于执行文本代码的解析器
- PHP的运行机制与原理(底层)
原文:http://www.jb51.net/article/74907.htm 说到php的运行机制还要先给大家介绍php的模块,PHP总共有三个模块:内核.Zend引擎.以及扩展层:PHP内核用来 ...