框架

框架就是一些类和接口的集合,通过这些类和接口协调来完成一系列的程序实现。JAVA框架可以分为三层,表示层,业务层和物理层。框架又叫开发中的半成品,它不能提供整个web应用程序的所有东西,但是有了框架,我们就可以集中精力进行业务逻辑的开发而不用去关心它的技术实现以及一些辅助的业务逻辑。

 

Spring、Spring MVC、Spring Boot

spring 是一个框架的集合,包含了很多组件。

 

spring MC 只是 spring 其中一个 web 组件。

 

关于 spring boot 官网给出的解释

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration.

英文不是特别好,大致意思是:

通过 spring boot ,你可以轻松地创建独立的、生产基于 spring 的应用程序,并运行它。

你可以以最小的 spring 平台和第三方类库启动你的应用,大多数spring boot 程序只需要很少的spring 配置。

 

关系大概就是这样

spring mvc < spring < springboot

 

Spring Boot 对比Spring的一些优点包括

  • 提供嵌入式容器支持
  • 使用命令java -jar独立运行jar
  • 在外部容器中部署时,可以选择排除依赖关系以避免潜在的jar冲突
  • 部署时灵活指定配置文件的选项
  • 用于集成测试的随机端口生成

结论

Spring Boot只是Spring本身的扩展,使开发,测试和部署更加方便。开箱即用。

 

spring IOC容器的初始化过程

1.resource 资源定位,BeanDefinition 资源定位。

2. BeanDefinition 载入过程,把用户定义好的bean表示成 IOC 容器内部数据结构,而这个容器内部数据结构就是BeanDefinition

3. 向 IOC 容器注册注册这些 BeanDefinition ,将这些bean保存到 hashmap 中。

 

BeanFactory 和 FactoryBean的区别

beanfactory 是个 factory ,也就是 IOC容器(spring 容器)或对象工厂。在spring中,所有的bean都由 beanfactory 来管理,提供了实例化对象和获取的功能。

使用场景:

  • 从 IOC 容器中获取bean
  • 检索 IOC 容器是否包含指定的bean
  • 判断bean是否是单例

FactoryBean 是个 bean,这个bean不是简单的bean,而是一个能生产或者修饰对象生成的工厂bean,它的实现与设计模式中的工厂模式和修饰器模式类似。

使用场景:

ProxyFactoryBean

 

spring bean的生命周期

  1. 实例化 Instantiation
  2. 属性赋值 Populate
  3. 初始化 Initialization
  4. 销毁 Destruction

 

 

spring 组件

Spring Cloud Config   配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion

Spring Cloud Bus 事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。

Eureka  云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

Hystrix  熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。

Ribbon 提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。

Feign  Feign是一种声明式、模板化的HTTP客户端。

Zuul  Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

Spring Cloud Sleuth 日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。链路追踪工具

Spring Cloud Security  基于spring security的安全工具包,为你的应用程序添加安全控制。

 

其它

zookeeper   分布式服务框架,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

docker  一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

kubernetes(k8s)  用于管理云平台中多个主机上的容器化的应用。提供了应用部署,规划,更新,维护的一种机制。

redis  一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

Mq  消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构

kafka  一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据

 

 

nacos 学习

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

  • 添加pom依赖:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>${latest.version}</version>
</dependency>
  • 增加配置文件
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  •  spring boot:

       @EnableDiscoveryClient

nacos管理页--> 服务管理-->服务列表,查询

 

使用nacos 注册服务,但是服务列表中没有服务信息

注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。

官网有如上一段话,一定注意版本!!!

另外好像服务发现有点延迟。

https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

 

Sentinel 是什么?

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

Sentinel 的主要特性:

Sentinel-features-overview

 

使用: JDK 1.8(必须)

下载 sentinel 控制台 

下载 sentinel-dashboard-1.7.2.jar 这个包,另一个启动报错,目前没看到官方给出的配置文件是什么样的

sentinel-envoy-rls-token-server-1.7.2.jar   应该是带登录功能的。默认用户名和密码都是 sentinel,鉴权模块文档

cmd 到目录下    8080是 sentinel的端口

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

若启动多个应用,则需要通过 -Dcsp.sentinel.api.port=xxxx

http://localhost:8080/#/login

 

应用接入控制台(不需要的可以不接入)

应用中引入 Transport 模块来与 Sentinel 控制台进行通信。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>x.y.z</version>
</dependency>

扩展:修改配置项

启动springboot 

一种:VM options 添加  -Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

第二种配置文件

#和控制台通信的端口
spring.cloud.sentinel.transport.port=8085
#控制台应用ip:端口
spring.cloud.sentinel.transport.dashboard=localhost:8080

默认不会主动通信,需要访问下加了注解的请求。

访问后会打印。  无法在控制台看到应用的话请往下看

2020-06-30 23:00:06.715  INFO 14304 --- [nio-8700-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 8 ms
INFO: Sentinel log output type is: file
INFO: Sentinel log charset is: utf-8
INFO: Sentinel log base directory is: C:\Users\dj\logs\csp\
INFO: Sentinel log name use pid is: false

三点需要注意下

1. 应用不会主动和控制台通信,需要访问加了注解的资源。

2.去掉 hystrix 依赖,不然会走 hystrix

3.访问了加了注解的方法,但是没打印日志

INFO: log base dir is: C:\Users\dj\logs\csp\
INFO: log name use pid is: false

添加pom,测试了多次,好像这一个dependency就可以,上面的transport 都不用了。我的是spring boot

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

整体整理下:

pom

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

配置:

#和控制台通信的端口
spring.cloud.sentinel.transport.port=8085
#控制台应用ip:端口
spring.cloud.sentinel.transport.dashboard=localhost:8080

注解:

@SentinelResource(value = "sayHello")
    @GetMapping("/aliveid")
    public String alive(@RequestParam("id") String id){
        return userApi.aliveById(id);
    }

sentinel 对 feign 的支持

@Bean
@SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class)
public RestTemplate restTemplate() {
    return new RestTemplate();
}

https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐