SpringCloud

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

Google

Facebook

七、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;

​ }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【2021年,将Spring全家桶系列课程进行Review,修复顺序等错误。进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并新增高级的Spring Security等内容,通过手把手一步步教你从零开始学应用Spring,课件将逐步进行上传,敬请期待】 本课程是Spring案例精讲课程的第四部分Spring Cloud,Spring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Spring Cloud的核心知识点:注册中心、服务提供者与消费者、服务的调用OpenFeign、Hystrix监控、服务网关gateway、消息驱动的微服务Spring Cloud Stream、分布式集群、分布式配置中心的案例介绍, 快速掌握Spring Cloud的核心知识,快速上手,为学习及工作做好充足的准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVC、Spring Boot、Spring Cloud及Spring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验  【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值