SpringCloud
1.引入jar包依赖 web + eureka server
2.配置eureka(application.properties)
3.添加注册,让项目变成一个eureka server
九、服务的提供者
1.导入jar包依赖(web + Eureka discovery)
2.配置application.properties
3.编写service实现
4.编写controller(提供rest api)
十、服务消费者
1.导入jar包(web + Eureka discovery)
2.application.properties
3.启动类
4.消费者的controller
十一、ribbon1.修改service2.在RestTemplate的实例上添加注解3.在Rest Api调用的时候才用的服务地址
一、spring Cloud常见的面试问题
二、什么是微服务(Microservices )
微服务概念的提出者:马丁福勒
http://blog.cuicc.com/blog/2015/07/22/microservices/
目前世界上还没有对微服务下唯一的结论
我们无法给出微服务架构风格的一个正式定义,但我们可以尝试去描述我们看到的符合该架构的一些共性
简单来说,微服务架构风格[1]是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,
服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。
这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。
技术维度理解:微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,
一个服务做一件事,从技术角度看就是一个小而独立的处理过程,类似进程概念,能够自行独立启动或销毁,拥有自己独立的数据库
三、spring Cloud的优缺点
优点
(1)每个服务足够内聚,足够小、代码容易理解这样聚焦一个指定的业务或者是业务需求开发起来比较简单,开发效率也高,一个服务可以只是专注做一件事情
(2)服务功能适合被小团队进行开发,这个开发团队可以是2到5人所组成的
(3)解耦合。是由功能意义的服务,无论是开发阶段或者是部署阶段都是独立的
(4)微服务可以使用不同的语法开发
(5)容易和第三方集成,微服务允许实现灵活的自动部署,通过集成工具。如:Jenkins
(6)微服务容易被一个开发人员理解、修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作的方式体现价值
(7)微服务允许利用融合现在最新的技术
(8)微服务只是业务逻辑的代码不会和css和html等界面混合
(9)每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一的数据库(持久化操作的能力增强了)
四种软件架构演进史
缺点
(1)开发人员要处理分布式系统的复杂性
(2)多服务运维难度,随着服务的增加,运维的成本也会增大
(3)服务之间的通讯成本增加
(4)数据要一致性(需要用到分布式事务处理–分布式事务处理也会降低程序的性能)
(5)性能监控成本的增加
四、spring cloud技术栈
spring cloud中有21种技术,还会有所增加,其中对我们开发人员来说不是要求所有的技术都掌握,我们只掌握其中的一部分就能进行spring cloud的开发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCbLSKyN-1603676545941)(file:///C:\Users\My\AppData\Local\Temp\ksohtml67080\wps1.jpg)]
微服务条目
落地实现
服务开发
springBoot、spring、springMVC
服务配置与管理
Netflix公司(网飞)Archairus、阿里Diamond等
服务的发现和注册
zookeeper、Consul、Eureka等
服务调用
RPC、Rest API
服务熔断
Hystrix、Envoy等
负载均衡
Ribbon、Nginx等
服务接口调用
Fegin等
消息队列
ActiveMQ、RabbitMq和Kafka
服务配置中心管理
springCloudConfig、Chef等
服务路由(API网关)
Zuul等
服务监控
Zabbix、Nagios、Metrics、Spectator等
…
…
五、公司技术选型的依据
(1)整体方案和框架的成熟度
(2)社区热度
(3)可维护性
(4)学习成本
六、了解当前IT公司微服务架构有哪些
阿里 —— dubbo/HSF
京东 —— JSF
新浪微博 —— Motan
当当网 —— dubboX
框架
Netflix/SPringCloud
Motan
gRPC
Thrift
Double/Dubbox
功能定位
完整的微服务框架
RPC框架,但整合ZK或Consul,实现集群环境的基本的服务注册/发现
RPC框架
RPC框架
服务创建
支持Rest
是 Ribbon支持多种可插播的序列化选择
否
否
否
否
支持RPC
否
是(Hession2)
是
是
是
支持多语言
是(Rest形式)
否
是
是
否
服务注册/发现
是(Eureka)Eureka服务注册表,Karyon服务端框架支持服务自注册和健康检查
是(Zookeeper/consul)
否
否
是
负载均衡
是(服务端zuul+客户端Ribbon) zuul-服务,动态路由 云端负载均衡Eureka(针对中间层服务器)
是(客户端)
否
否
是(客户端)
配置服务
Netflix Archaius Spring cloud config server 集中配置
服务调用链监控
是(zuul) zuul提供边缘服务,API网关
高可用/容错
是(服务端Hystrix+客户端Ribbon)
Netflix
Sina
七、Dubbo和spring Cloud的区别
具体的回答,大家可以参考:dubbo刘军
http://www.sohu.com/a/215931152_827544
首先要明确的一点是 Dubbo 和 Spring Cloud 并不是完全的竞争关系,两者所解决的问题域并不一样:Dubbo 的定位始终是一款 RPC 框架,而 Spring Cloud 的目标是微服务架构下的一站式解决方案。
Dubbo 之后会积极寻求适配到 Spring Cloud 生态,比如作为 Spring Cloud 的二进制通信方案来发挥 Dubbo 的性能优势,或者 Dubbo 通过模块化以及对 http 的支持适配到 Spring Cloud 。
从技术的角度去看Dubbo和spring cloud的区别
需要解决的问题
Dubbo
spring cloud
服务注册中心
zookeeper
spring cloud Netflix Eureka
服务调用方式
RPC
Rest API
服务监控
Dubbo-monitor
spring boot admin
端路由
不完善
spring cloud Netflix Hystrix
服务网关
无
spring cloud Netflix Zuul
分布式配置
无
spring cloud config
服务跟踪
无
spring cloud sleuth
消息总线
无
spring cloud bus
数据流
无
spring cloud stream
批量任务
无
spring cloud task
八、Eureka
Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,已实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper
eureka和zookeeper的区别(CAP)
https://baike.baidu.com/item/CAP%E5%8E%9F%E5%88%99/5712863?fr=aladdin
Zookeeper保证CP
当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,
但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。
但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,
剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s,
且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。
在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,
虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。
Eureka保证AP
Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
\1. Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
\2. Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
\3. 当网络稳定时,当前实例新的注册信息会被同步到其它节点中
因此, Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪
Eureka作为单纯的服务注册中心来说要比zookeeper更加“专业”,
因为注册服务更重要的是可用性,我们可以接受短期内达不到一致性的状况。
不过Eureka目前1.X版本的实现是基于servlet的java web应用,
它的极限性能肯定会受到影响。期待正在开发之中的2.X版本能够从servlet中独立出来成为单独可部署执行的服务。
1.引入jar包依赖 web + eureka server
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-test
test
2.配置eureka(application.properties)
#配置eureka的端口号
server.port=XXXX
#eureka相关配置
eureka.instance.hostname=eureka-server
#不希望自己也注册到eureka中
eureka.client.register-with-eureka=false
#不从eureka中获取到注册信息
eureka.client.fetch-registry=false
#指定注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:XXXX/eureka/
3.添加注册,让项目变成一个eureka server
@SpringBootApplication
@EnableEurekaServer //表示该工程是一个eureka服务
public class SpringCloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaApplication.class, args);
}
}
九、服务的提供者
1.导入jar包依赖(web + Eureka discovery)
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-test
test
2.配置application.properties
#端口号
server.port=XXXX
#服务提供者取名
spring.application.name=server-01
#指定注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:XXXX/eureka/
#注册服务的时候指定使用ip地址进行注册
eureka.instance.prefer-ip-address=true
3.编写service实现
@Service
public class ItemServiceImpl {
public String getItemById(String itemId){
return “您查找的商品编号是:” + itemId;
}
}
4.编写controller(提供rest api)
@RestController
public class ItemController {
@Autowired
private ItemServiceImpl itemService;
@GetMapping("/item/{id}")
public String item(@PathVariable(value = “id”) String id){
return itemService.getItemById(id);
}
}
十、服务消费者
1.导入jar包(web + Eureka discovery)
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-test
test
2.application.properties
server.port=8080
#指定应用程序的名字
spring.application.name=eureka-consumer
#指定注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:XXXX/eureka/
#注册服务的时候指定使用ip地址进行注册
eureka.instance.prefer-ip-address=true
3.启动类
@SpringBootApplication
@EnableDiscoveryClient //开启服务发现
public class SpringCloudWebApplication {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudWebApplication.class, args);
}
}
4.消费者的controller
@RestController
public class UserContorller {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/buy/{itemid}")
public String buy(@PathVariable(value = “itemid”) String itemid){
String string = restTemplate.getForObject(“http://192.168.25.1:XXXX/item/” + itemid, String.class);
return string;
}
}
**十一、**ribbon
负载均衡
将服务达成jar包,单独启动(多个之间的端口号是不一样的)
1.修改service
#端口号
server.port=7002
为了表示是不一样的应用,我们是在service中返回的字符串添加了标识
2.在RestTemplate的实例上添加注解
@Bean
@LoadBalanced //启动负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();}
3.在Rest Api调用的时候才用的服务地址
@GetMapping("/buy/{itemid}")
public String buy(@PathVariable(value = “itemid”) String itemid){
String string = restTemplate.getForObject(“http://SERVER-01/item/” + itemid, String.class);
return string;
itemid}")
public String buy(@PathVariable(value = “itemid”) String itemid){
String string = restTemplate.getForObject(“http://192.168.25.1:7001/item/” + itemid, String.class);
return string;
}
}
**十一、**ribbon
负载均衡
将服务达成jar包,单独启动(多个之间的端口号是不一样的)
1.修改service
#端口号
server.port=7002
为了表示是不一样的应用,我们是在service中返回的字符串添加了标识
2.在RestTemplate的实例上添加注解
@Bean
@LoadBalanced //启动负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();}
3.在Rest Api调用的时候才用的服务地址
@GetMapping("/buy/{itemid}")
public String buy(@PathVariable(value = “itemid”) String itemid){
String string = restTemplate.getForObject(“http://SERVER-01/item/” + itemid, String.class);
return string;
}