spring事务

Spring声明式事务七种传播行为

  • REQUIRES_NEW:不管是否存在事务,该方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。
  • NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。
  • REQUIRED:业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务。这是spring默认的传播行为
  • MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出异常。
查看更多

Hystrix Turbine

Hystrix Turbine简介

看单个的Hystrix Dashboard的数据并没有什么多大的价值,要想看这个系统的Hystrix Dashboard数据就需要用到Hystrix Turbine。Hystrix Turbine将每个服务Hystrix Dashboard数据进行了整合。Hystrix Turbine的使用非常简单,只需要引入相应的依赖和加上注解和配置就可以了。

引入相应的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>

在其入口类ServiceTurbineApplication加上注解@EnableTurbine,开启turbine,@EnableTurbine注解包含了@EnableDiscoveryClient注解,即开启了注册服务。

查看更多

spring cloud gateway 入门

1
2
3
4
5
6
7
8
9
10
11
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 集成eureka -->
<!--<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>-->
</dependencies>

spring-cloud-gateway有两种配置方式,一种是在application.yml中配置,一种是使用@Bean对象注入。(注意:二者选其一)

application.yml方式

1
2
3
4
5
6
7
8
9
10
11
spring:
cloud:
gateway:
routes:
- id: WEB
uri: http://127.0.0.1:8661
predicates:
- Path=/web/{segment}
filters:
- SetPath=/{segment}
- StripPrefix=1

@Bean对象注入配置方式

1
2
3
4
5
6
7
8
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("WEB", r -> r.path("/web/{segment}")
.filters(f -> f.setPath("/{segment}"))
.uri("http://127.0.0.1:8661"))
.build();
}

查看更多

dist文件使用

生成dist目录

npm run build

安装express-generator生成器

执行 $ npm install express-generator -g 进行安装

创建一个express项目

执行 $ express expressDemo (expressDemo是项目名)

进入expressDemo目录,安装项目依赖

npm install

把dist目录下的所有文件复制到express项目的public文件夹下

然后运行 $ npm start 启动expressDemo
打开浏览器,输入 http://localhost:3000, 就可以看到效果了

查看更多

vue

运行vue项目

打开cmd 进入项目的路径
进入项目之后安装依赖

npm install
你的项目下会生成名字叫:node_modules 的文件

然后执行以下语句,就会自动打开浏览器了

npm run dev

dns

DNS使用的是TCP协议还是UDP协议简析?

dns同时占用tcp和udp的53端口!
区域传复送时使用TCP,主要有一下两点考虑:

  • 1.辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了制解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的百数据量要多得多。
  • 2.TCP是一种可靠的连接,保证了数据的准确性。
    域名解析时使用UDP协议:
    客户端向DNS服务器查询域名,一般返回的度内容都不超过512字节,用UDP传输即可。不用经过TCP三次握手,这样DNS服务器负载更低,响应更快。虽然从理论上说,问客户端也可以指定向DNS服务器查询的时候使用TCP,但事答实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。

查看更多

粘包与拆包

TCP粘包:socket读取时,读到了实际意义上的两个或多个数据包的内容,同时将其作为一个数据包进行处理。

TCP拆包:socket读取时,没有完整地读取一个数据包,只读取一部分。

粘包/拆包问题一般的处理方式有四种:

  • 数据段定长处理,位数不足的空位补齐。
  • 消息头+消息体,消息头中一般会包含消息体的长度,消息类型等信息,消息体为实际数据体。
  • 特殊字符(如:回车符)作为消息数据的结尾,以实现消息数据的分段。
查看更多

shell

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

查看更多

Sidecar模式:下一代微服务架构的关键

Sidecar模式:下一代微服务架构的关键

什么是Sidecar模式?

Sidecar模式是一种将应用功能从应用本身剥离出来作为单独进程的方式。该模式允许我们向应用无侵入添加多种功能,避免了为满足第三方组件需求而向应用添加额外的配置代码。

就像边车加装在摩托车上一样,在软件架构中,sidecar附加到主应用,或者叫父应用上,以扩展/增强功能特性,同时Sidecar与主应用是松耦合的。

举个例子,假设现在有6个相互通信的微服务,每个微服务都需要具有可观察性、监控、日志记录、配置、断路器等功能,而所有这些功能都是在微服务中使用一些第三方库实现的。

这样一组服务的实际情况可能会非常复杂,增加了应用的整体复杂性,尤其是当每个微服务用不同的语言编写、使用不同的基于.net、Java、Python等语言的第三方库