首页 文章 精选 留言 我的

精选列表

搜索[Solon框架],共10000篇文章
优秀的个人博客,低调大师

go-netty 高性能网络框架

GO-NETTY github.com/go-netty/go-netty Introduction (介绍) go-netty is heavily inspired bynetty go-netty 大量参考了netty的设计并融合Golang本身的协程特性而开发的一款高性能网络库 Feature (特性) Extensible multi-transport protocol support, default support TCP, KCP, Websocket 可扩展多种传输协议,并且默认实现了 TCP, KCP, Websocket Extensible multi-codec support 可扩展多种解码器,默认实现了常见的编解码器 Based on responsibility chain model 基于责任链模型的流程控制 TODO (待完成) test case docs examples Examples (例子) chat_server (基于websocket的聊天室) file_server (基于http的文件浏览器) tcp_server (自义定tcp服务器) Usage (使用) 创建bootstrap, 用于提供服务或者对外建立连接 var bootstrap = netty.NewBootstrap() 配置服务连接的处理器 (同样还有一个ClientInitializer 对应客户端连接处理器配置) bootstrap.ChildInitializer(func(channel netty.Channel) { channel.Pipeline(). // 按照自定义协议解码帧(2字节的长度字段) AddLast(frame.LengthFieldCodec(binary.LittleEndian, 1024, 0, 2, 0, 0)). // 消息内容为文本格式(可自定义为 json,protobuf 等编解码器) AddLast(format.TextCodec()). // 处理消息 AddLast(LogHandler{"Server"}) }) 配置服务器(客户端)所使用的传输协议 bootstrap.Transport(tcp.New()) 开始监听端口并开始提供服务,直到收到指定信号后退出 bootstrap.Listen("tcp://0.0.0.0:6565").RunForever(os.Kill, os.Interrupt) LogHandler 处理器 type LogHandler struct { role string } func (l LogHandler) HandleActive(ctx netty.ActiveContext) { fmt.Println(l.role, "->", "active:", ctx.Channel().RemoteAddr()) // 给对端发送一条消息,将进入如下流程(视编解码配置) // Text -> TextCodec -> LengthFieldCodec -> Channel.Write // 文本 文本编码 组装协议格式(长度字段) 网络发送 ctx.Write("Hello I'm " + l.role) // 向后续的handler传递控制权 // 如果是最后一个handler或者需要中断请求可以不用调用 ctx.HandleActive() } func (l LogHandler) HandleRead(ctx netty.InboundContext, message netty.Message) { fmt.Println(l.role, "->", "handle read:", message) // 向后续的handler传递控制权 // 如果是最后一个handler或者需要中断请求可以不用调用 ctx.HandleRead(message) } func (l LogHandler) HandleInactive(ctx netty.InactiveContext, ex netty.Exception) { fmt.Println(l.role, "->", "inactive:", ctx.Channel().RemoteAddr(), ex) // 向后续的handler传递控制权 // 如果是最后一个handler或者需要中断请求可以不用调用 ctx.HandleInactive(ex) }

优秀的个人博客,低调大师

Riot 4.6.0 发布,JavaScript 的 MVP 框架

Riot 4.6.0 发布了,更新内容如下: 修复了在<template>标签中呈现文本表达式的情况下的小写问题 更新改进了核心代码、编译器和 dom 绑定 通过<slot>属性添加对 HOC(高阶组件)组件的支持,例如: Provider <hoc-component> <slot message={ message } theme={ theme }/> <script> export default { message: 'hello', theme: 'dark' } </script> </hoc-component> Consumer <app> <hoc-component> <!-- the {message} property will be provided by the <hoc-component> --> <h1>{ message }</h1> <!-- the {theme} property will be provided by the <hoc-component> --> <sidebar theme={ theme }/> </hoc-component> <!-- the {message} property is not available outside of the <hoc-component> --> <p>{ message }</p> </app> Riot 是一个简单而优雅的基于组件的 UI 库,为所有现代浏览器带来了自定义组件。其支持浏览器包括: 它的体积也很小,只有 6k:

优秀的个人博客,低调大师

PhalApi 2.8.1 发布,PHP 开源接口框架

PhalApi 2.8.1 [主要更新] 1、文件日志PhalApi\Logger\FileLogger区分隐式静默和显式异常两种模式,可通过\PhalApi\DI()->debug全局模式或初始化时指定调试模式。为调试模式时,若写入失败将500异常提示 1、文件配置PhalApi\Config\FileConfig区分隐式静默和显式异常两种模式,可通过\PhalApi\DI()->debug全局模式或初始化时指定调试模式。为调试模式时,若配置不存在将500异常提示 [辅助更新] [BUG修复] 1、URI路由匹配模式下默认接口读取不到 2、配置多个数据库时候, 调用get、update时会提示 dbs.tables should not be empty (issue 97)

优秀的个人博客,低调大师

CakePHP 3.8.3 发布,PHP 快速开发框架

CakePHP 3.8.3 发布了,这是一个维护版本,修复了以下问题: 添加了 IntegrationTestTrait::setUnlockedFields(),使测试中的 SecurityComponent 更简单 改进了 EntityInterface::setDirty() 的向前兼容注释 TestEmailTransport::send()的返回值与实际实现相匹配 修复了分页元标记中的双重转义 改进 API 文档 传递给 FunctionExpression 对象的子查询现在封装在括号中 Cake\Network\Socket现在可以连接到 unix 套接字 控制台错误代码现在约束在 1 到 244 之间 详情可查看发布公告。

优秀的个人博客,低调大师

Mockito框架里面的@Mock注解原理

@Mock注解就是其实就是用cglib的原理帮我们new了一个@Mock注解作用类的子类,什么意思呢,往下看 首先是Company,此时hh方法返回值是”字符串”, package com.one.util; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class Company { private String name; public String hh(){ return "字符串"; } } User类,mm()的返回值就是Company类的hh()返回值 package com.one.util; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class User { private Company company; private int age; public String mm(){ return company.hh(); } } 然后UserTest类如下,此时可以看到下面的Company上面放了@Mock注解,他的作用就是帮我们生产一个Company类的子类(假如是CompanyZi),然后使用多态赋值给下面的company(就像这样Company company=new CompanyZi),而且这个ComanyZi类里面的hh()方法的返回值是null,为什么这样说呢,我们看下面的结果 package com.one.util; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import static org.assertj.core.api.Assertions.catchThrowable; @RunWith(MockitoJUnitRunner.class) public class UserTest { @Mock private Company company; private User user; @Before public void setUp() { user = new User(company, 1); } @Test public void tt() { catchThrowable(() -> { String mm = user.mm(); System.out.println(mm); }); } } 此时可以看到结果是null 简单来说上面的代码可以变成下面这样 首先是Company,此时hh方法返回值是”字符串”, package com.one.util; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class Company { private String name; public String hh(){ return "字符串"; } } User类,mm()的返回值就是Company类的hh()返回值 package com.one.util; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class User { private Company company; private int age; public String mm(){ return company.hh(); } } 然后UserTest类如下,此时下面的类ComapanyZi就相当于上面的被@Mock注解的company的最终被new的对象,只不过@Mock注解帮我做了下面的CompanyZi这个类,此时可以看到下面的ComapanyZi返回的是null package com.one.util; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import static org.assertj.core.api.Assertions.catchThrowable; @RunWith(JUnit4.class) public class UserTest { class ComapanyZi extends Company{ public ComapanyZi(String name) { super(name); } public String hh(){ return null; } } private User user; @Test public void name() { user=new User(new ComapanyZi("zi"),1); Throwable throwable = catchThrowable(() -> { System.out.println(user.mm()); }); } } 此时可以看到结果是null 我们可以验证上面的结论 就是给@Mock注解的类添加一个final,然后在运行的时候就报错了 Company类,此时可以看到Compan已经被final修改了 package com.one.util; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public final class Company { private String name; public String hh(){ return "字符串"; } } User类 package com.one.util; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class User { private Company company; private int age; public String mm(){ return company.hh(); } } 然后测试如下,然后运行下面的name方法,然后结果如下所示 package com.one.util; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class UserTest { @Mock private Company company; private User user; @Before public void setUp(){ user = new User(company,1); } @Test public void name() { user.mm(); } } 此时可以看到报错了,说Company不能被final修改,者更好符号cglib的规则 原文链接

优秀的个人博客,低调大师

Docker 的基本概念和框架

文章首发于公众号《程序员果果》地址:https://mp.weixin.qq.com/s/8VM-c_UkxYcVw2Itiapw4w 一、Docker简介 什么是容器 ? 一种虚拟化的方案 操作系统级别的虚拟化 只能运行相同或相似的内核操作系统 依赖于Linux内核特性:Namespace和Cgroups(Control Group) 容器技术有哪些优点 ? 从图中我们很容器看出,容器技术资源占用比较少,由于虚拟机需要模拟硬件的行为,对CUP和内存的损耗比较大。所以同样配置的服务器,容器技术就有以下优点: 资源占用比较少 CPU/内存消耗低 那既然容器有这些优点,为什么直到Docker的出现,才真正的被关注呢?一个重要原因就是容器技术的复杂性。容器本身就很复杂,他依赖于Linux内核的很多特性,而且他不易安装,也不易于管理和实现自动化。而Docker就是为了改变这一切而产生的。 什么是Docker ? 将应用自动部署到容器的开源引擎 Go语言实现的开源项目,诞生于2013年初,最初发起者是dotCloud公司 Docker的特点 提供简单轻量的建模方式:简单,Docker非常容器上手,用户只需要几分钟,就能把自己的项目Docker化。 职责的逻辑分离:使用Docker,开发人员只需要关心容器中运行的程序,运维人员只需要关心如何管理容器;Docker设计的目的就是加强开发人员写代码的环境与应用程序要部署的生成环境的一致性。 快速高效的开发生命周期:Docker的目标之一是缩短代码开发到测试到部署上线的运行周期,让应用程序具备可移植性,在容器中开发,以容器的形式交付和分发,这样开发、测试、生产,都使用相同的环境,这样也就避免了额外的调试和部署上的开销,这样就能有效的缩短产品的上线周期。 鼓励使用面向服务的架构:Docker推荐单个容器只运行一个应用程序或者进程,这样就形成了一个分布式的应用程序模型,在这种模式下应用程序或服务都可以表述为一系列内部互联的容器,从而使分布式部署应用程序扩展或调试都变得非常简单。这就像我们开发中常用的思想;高内聚,低耦合,单一任务。这样就能避免在同一服务器上部署不同服务时,可能带来的服务之间相互影响。这样服务运行中出现问题时,也比较容易定位问题的所在。 Docker的使用场景 使用Docker容器开发、测试、部署服务:因为Docker本身非常轻量化,所以本地开发人员可以构建、运行并分享Docker容器。容器可以在开发环境中创建,然后再提交到测试,最终进入生产环境。 创建隔离的运行环境:在很多企业应用中,同一服务的不同版本可能服务于不同的用户,那么使用Docker非常容易创建不同的生成环境来运行不同的服务。 搭建测试环境:由于Docker的轻量化,所以开发者很容易利用Docker在本地搭建测试环境,用来测试程序在不用系统下的兼容性;甚至搭建集群的部署测试。 构建多用户的平台即服务(PaaS)基础设施。 提供软件即服务(SaaS)应用程序。 高性能、超大规模的宿主机部署。 二、Docker的基本组成 Docker 包含了一下几个重要主要部分: Docker Client 客户端 Docker Daemon 守护进程 Docker Image 镜像 Docker Container 容器 Docker Registry 仓库 Docker 客户端 / 守护进程 Docker是C/S架构的程序:Docker客户端向Docker服务器端,也就是Docker的守护进程发出请求,守护进程处理完所有的请求工作并返回结果。 Docker 客户端对服务器端的访问既可以是本地也可以通过远程来访问。 Docker Image 镜像 镜像是Docker容器的基石,容器基于镜像启动和运行。镜像就好比容器的源代码,保存了用于启动容器的各种条件。 Docker镜像是一个层叠的只读文件系统。 Docker镜像使用联合加载技术 docker的镜像是一个层叠的只读文件系统,最低端是一个引导文件系统(即bootfs),第二层是root文件系统(即rootfs),它位于bootfs之上,可以是一种或多种操作系统,比如ubuntu或者centos。在docker中,root文件系统永远只能是只读状态,并且docker运用联合加载技术又会在root文件系统之上加载更多的只读文件系统,联合加载指的是一次加载多个文件系统,但是在外面看起来只能看到一个文件系统,联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有的底层文件和目录,docker将这样的文件系统称为镜像。 Docker Container 容器 容器通过镜像来启动,Docker的容器是Docker的执行来源,容器中可以运行客户的一个或多个进程,如果说镜像是Docker声明周期中的构建和打包阶段,那么容器则是启动和执行阶段。 当一个容器启动时,docker会在该镜像的最顶层加载一个读写文件系统,也就是一个可写的文件层,我们在docker运行的程序,就是在这个层中进行执行的,当docker第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层上,比如像修改一个文件,该文件首先会从读写层下面的只读层复制到该读写层,该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏,这就是docker的一个重要技术:写时复制(copy on write)。每个只读镜像层都是只读的,永远不会变化,当创建一个新容器时,docker会构建出一个镜像栈,如下图所示: Docker Registry 仓库 docker用仓库来保存用户构建的镜像,仓库分为公有和私有两种,Docker公司提供了一个公有的仓库Docker Hub。 三、Docker 依赖的 Linux内核特性 Docker依赖于Linux内核的两个重要特性: Namespaces 命名空间 Control groups (cgroups) 控制组 Namespaces 命名空间 很多编程语言都包含了“命名空间”的概念,我们可以认为“命名空间”是一种“封装”的概念, 而“封装”本身实际上实现的是代码的隔离。而在操作系统中,命名空间提供的是系统资源的隔离,而系统资源包括了进程、网络、文件系统等。 我们从Docker公开的文档来看,它使用了5种命名空间: PID(Process ID) 进程隔离 NET(Network)管理网络接口 IPC(InterProcess Communication)管理跨进程通信的访问 MNT(Mount)管理挂载点 UTS(Unix Timesharing System) 隔离内核和版本标识 那么,这些隔离的资源,是如何被管理起来的呢?这就需要用到——Control groups(cgroup)控制组了。 Control groups (cgroups) 控制组 Control groups是Linux内核提供的,一种可以限制、记录、隔离进程组所使用的物理资源的机制。最初是由google工程师提出,并且在2007年时被Linux的内核的2.6.24版本引进。可以说,Control groups就是为容器而生的,没有Control groups就没有容器技术的今天。 Control groups提供了以下功能: 资源限制:例如,memory(内存)子系统可以为进程组设定一个内存使用的上限,一旦进程组使用的内存达到了限额,该进程组再发出内存申请时,就会发出“out of memory”(内存溢出)的警告。 优先级设定:它可以设定哪些进程组可以使用更大的CPU或者磁盘IO的资源。 资源计量:它可以计算进程组使用了多少系统资源。尤其是在计费系统中,这一点十分重要。 资源控制:它可以将进程组挂起或恢复。 Namespace 和 cgroup带给Docker的能力 到这里我们了解了Namespace和CGroup的概念和职能,而这两个特性带给了Docker哪些能力呢?如下: 文件系统隔离:首先是文件系统的隔离,每个Docker的容器,都可以拥有自己的root文件系统。 进程隔离:每个容器都运行在自己的进程环境中。 网络隔离:容器间的虚拟网络接口和IP地址都是分开的。 资源的隔离和分组:使用cgroups将cpu和内存之类的资源独立分配给每个Docker容器。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册