最新文章

文章排行

  • centos安装mariadb

    由于数据库有一下比较新的东西,所以要安装一下新版本的数据库 原计划是安装mysql的,由于各种原因就决定安装mysql的另一个分支mariadb了首先新增/修改这个文件""  '' /etc/yum.repos.d/MariaDB.repo往里面写入内容[mariadb]name = MariaDBbaseurl = http://mirrors.aliyun.com/mariadb/yum/10.3/centos7-amd64/gpgkey = http://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDBgpgcheck = 1由于我比较想省事吧,就用工具直接打开这个文件,复制保存就行了然后运行安装命令yum -y install MariaDB-server MariaDB-client等一会安装完后再启动systemctl start mariadb开机启动systemctl enable mariadb然后是初始化设置mysql_secure_installation接下来是初始化设置了,复制粘贴一下网上的首先是设置密码,会提示先输入密码Enter current password for root (enter for none):<–初次运行直接回车设置密码Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车New password: <– 设置root用户的密码Re-enter new password: <– 再输入一次你设置的密码其他配置Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车,Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车初始化MariaDB完成,接下来测试登录mysql -uroot -ppassword完成。附上一些用户配置创建用户命令mysql>create user username@localhost identified by 'password';直接创建用户并授权的命令mysql>grant all on *.* to username@localhost indentified by 'password';授予外网登陆权限 mysql>grant all privileges on *.* to username@'%' identified by 'password';授予权限并且可以授权mysql>grant all privileges on *.* to username@'hostname' identified by 'password' with grant option;后记:其实大部分设置都可以用Navicat去完成。

  • 基于Linux的zookeeper客户端命令

    前言       之前我们已经通过“初探zookeeper“一文,对它有了初步的了解,这一节让我们更深入了解一下。      注:作者运行环境是centos,其实跟linux命令差别也没多大。基本操作首先我们进入zookeeper目录 cd /usr/local/zookeeper进入bin目录 cd bin重新启动zookeeper zkServer.sh restart打开zookeeper客户端 zkCli.shls+节点,可以看到该节点下有哪些节点stat+节点,可以看到节点的基本信息ls2+节点,就可以看到该节点下的节点和节点的一些基本信息,可以说ls2是ls和stat的合成体get+节点,可以看到该节点下存储的数据(当前为空)接下来我们解释一下这些基本信息的含义:cZxid 是创建之后分配的idctime 节点创建时间mZxid 修改时分配的idmtime 修改时的时间pZxid 子节点的idcversion 节点的版本号dataversion 当前节点数据的版本号aclVersion 权限版本号ephemeralOwner 判断是节点类型 0x0是永久节点dataLength 数据长度numChildren 下面子节点数量create创建临时节点只需要加参数 -e重启后发现temp消失了创建有序节点 -sset命令用来设置值通过get命令可以看到/lin下的数据参数如果我们执行就会报版本不一致的错误,这时我们只要输入正确的version才会执行成功,相应的version也会累加一通过get就可以看到设置值已经成功delete命令,不用说大家也都知道了,就是删除节点需要注意的是,如果节点有子节点会删除失败watcher机制针对每一个节点的操作都会有一个监督者->watcher当监控的某个对象(znode)发生变化时,则触发watcher事件zk中的watcher是一次性的,触发后就销毁父节点子节点增删改都能触发其watcher事件不同类型的操作,触发watcher事件也不同通过help命令,我们看到部分命令都有watch命令watch事件类型创建父节点触发:nodeCreated  修改父节点数据触发:nodeDataChanged删除父节点触发:nodeDeletedls为父节点设置watcher,创建删除子节点都触发nodeChildrenChanded事件,修改子节点不会触发事件说明:因为触发后就会销毁,所以每次触发完后都必须再设置watch事件watcher使用场景:统一资源配置(不同服务器统一配置)

  • 初探zookeeper

    前言         由于公司项目每次运行前都要启动zookeeper,之前并不太深入了解这个东西,所以就学习了一下,并记录下来。zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。来源于百度介绍,想了解更多可以自行搜索。下面进入正题。安装配置首先登陆官网 http://zookeeper.apache.org/点击调到下载页面我是下载历史版本-3.4.11版本然后把zookeeper-3.4.11.tar.gz上传至/home目录下进入该路径 cd /home解压  tar -zxvf  zookeeper-3.4.11.tar.gz重命名 mv zookeeper-3.4.11 zookeeper移动到/usr/local目录 mv zookeeper /usr/local配置zookeeper环境,修改/etc/profile文件添加内容备注:需要安装配置jdk目录介绍首先我们进入zookeeper目录cd /usr/local/zookeeper查看目录ll1.bin目录主要是一些运行命令进入bin目录cd bin.cmd主要是windows下的可执行命令,.sh是Linux下的命令2.conf存放配置文件具体设置内容tickTime 用于计算时间的单元,比如session超时:H*tickTimeinitLimit 用于集群,允许从节点链接并同步到master节点的初始化链接时间,以tickTime的倍数来表示syncLimit 用于集群,master主节点与从节点之间发送消息,请求和应答时间长度(心跳机制)dataDir 存放数据目录(必须配置);dataLogDri 日志目录。如果不配置就会与dataDir共用clientPort 链接服务器的端口3.contrib附加的一些功能4.dist-maven mvn编译后的目录5.doc 文档打开index文件就可以看到详细文档6.lib需要依赖的jar包7.recipes案例demo代码8.src源码zoo.cfg配置详细tickTime 用于计算时间的单元,比如session超时:H*tickTimeinitLimit 用于集群,允许从节点链接并同步到master节点的初始化链接时间,以tickTime的倍数来表示syncLimit 用于集群,master主节点与从节点之间发送消息,请求和应答时间长度(心跳机制)dataDir 存放数据目录(必须配置);dataLogDri 日志目录。如果不配置就会与dataDir共用clientPort 链接服务器的端口zookeeper基本数据模型1.树形结构2.每一个节点都成为znode,可以有子节点,也可以有数据3.每个节点分为临时节点和永久节点,临时节点在客户端断开后消失4.每一个zk节点都有各自的版本号,可以通过命令行来显示节点信息5.每当节点数据发生变化,那么该节点的版本号会累加(乐观锁)6.删除/修改过时节点,版本号不匹配会报错7.每个zk节点存储的数据不宜过大,几k即可8.节点可以设置权限ACL,可以通过权限来限制用户的访问zookeeper作用体现1.master节点选举,主节点挂了以后,从节点就会接受工作,并且保证这个节点是唯一的,这就是所谓的首脑模式,从而保证我们的集群是搞可用的2.统一的配置文件管理,即只需要部署一台服务器,则可以把相同配置文件同步到其他的服务器,此操作在云计算中用的比较多(比如统一修改redis配置)3.发布与订阅,类似消息队列MQ,dubbo发布者把数据存在node上,订阅者会读取这些信息4.提供分布式锁,分布式环境中不同进程之间争夺资源,类似多线程的锁5.集群管理,集群中保证数据的强一致性zookeeper特性-session基本原理客户端与服务端之间存在会话每个回话都可以设置超时时间心跳介绍,session过期session过期,临时节点node会被抛弃心跳机制,客户端会向服务端发送ping包请求单机版进入配置文件cd /usr/local/zookeeper/conf复制一份配置文件cp zoo_samle.cfg zoo.cfg修改zoo.cfgdataDir=/usr/local/zookeeper/dataDirdataLogDir=/usr/local/zookeeper/dataDirLog在该目录下创建这两个目录mkdir dataDirmkdir dataLogDir进入bin目录执行./zkServer.sh start启动其他命令:status可查看状态restart重启stop停止这个时候我们已经启动了让我们来连接客户端,看看里面的内容输入help,我们就可以看到相关的指令我们可以输入ls+节点名就可以看到相关节点下的内容如果我们需要退出客户端,只需要按ctrl+c就可以退出,输入pwd就可以看到当前所在的文件下(持续优化更新)

  • 多选框全选实现

    页面代码,列表多选框  <c:forEach items="${list}" var="obj"> <tr id="tr${obj.id}"> <td><input name="searchId" type="checkbox" value="${obj.id}"></td> <td>${obj.product_code}</td> <td style=" word-wrap:break-word;word-break:break-all;white-space: normal">${obj.product_name}</td> <td style=" word-wrap:break-word;word-break:break-all;white-space: normal">${obj.category_name}</td> <td >${obj.old_cost_price}</td> <td >${obj.cost_price}</td> <td >${obj.old_price}</td> <td >${obj.price}</td> <td>${obj.nowPrice}</td> <td >${obj.rebate}</td> <td>${obj.num}</td> </tr> </c:forEach>多选按钮<input type="checkbox" name="checkAll">全选js代码$(function () { //全选按钮实现 $("input[name=checkAll]").click(function () { if (this.checked) { $("input[name=searchId]").prop("checked", true); } else { $("input[name=searchId]").prop("checked", false); } }); //反选实现 $("input[name=searchId]").click(function () { var allCheckBox=$("input[name=searchId]"); var same=true; var temp=allCheckBox[0].checked; for (var i=0;i<allCheckBox.length;i++){ if (allCheckBox[i].checked!==temp){ same=false; break; } } if (same){ $("input[name=checkAll]").prop("checked", temp); } else { $("input[name=checkAll]").prop("checked", false); } });});

  • zookeeper acl命令

    前言 acl(access control lists)权限控制针对节点可以设置相关读写等权限,从而保障数据的安全性权限permission可以指定不同的权限范围以及角色acl命令行通过客户端help命令,我们可以看到关于acl的一些命令getAcl获取某个节点的acl权限信息setAcl设置某个节点的acl权限信息addauth:输入认证授权信息,注册时输入明文账号密码,但是在zookeeper系统里,密码都是以加密形式存在的acl的构成zookeeper的acl通过[scheme:id:permissions]来构成权限列表(scheme:代表某种权限机制,id:代表允许访问的用户,permissions:权限组合字符串)world:world下只有一个id,即只有一个用户,也就是anyone,那么组合的写法就是world:anyone[permissions]auth:代表认证登录,需要注册用户有权限即可,形式为auth:user:password:[permissions]digest:需要对密码加密才能访问,形式为:digest:username:BASE64(SHA1(password)):[permissions]简而言之,auth和digest的区别就在于,前者明文,后者密文 setAcl /path auth:lee:lee:cdrwa与setAcl /path digest:lee:BASE64(SHA1(password))cdrwa是等价的,在通过addauth digest lee:lee 后都能操作指定节点的权限ip:当设置为ip指定的ip地址,此时显示ip进行访问,比如ip:192.169.1.1[permissions]super:代表超级管理员,拥有所有权限权限字符串缩写crdwacreate 创建子节点read 获取节点/子节点write设置节点数据delete删除子节点admin设置权限命令world:anyone:cdrwa图中我们把/lin的delete权限去掉,创建子节点,尝试删除它,可以看到删除失败,值得注意的是,但是我们是可以删除/lin的,只能控制子节点auth:user:pwd:cdrwa第一次添加失败是因为我们没有加上用户,所以我们要把用户添加才能进行该设置权限的操作(备注合理)虽然我们再次进行设置,但是我们发现用户密码还是没有变,还是按照第一个来digest:user:BASE64(SHA1(pwa)):cdrwa我们通过设置密文的权限我们发现退出后无法访问,通过明文密码登录才能进行操作addauth digest user:pwaip:192.168.1.1:cdrwa接下来我们讲最后一种:super,步骤如下1.修改zkServer.sh增加super管理员2.重启zkServer.sh通过操作我们可以发现,/lin是没有访问权限的,但是用管理员账号登录后就可以操作了ACL的常用使用场景开发/测试环境分离,开发者无权操作测试库的节点,只能查看生产环境上控制指定ip的服务可以访问相关节点,防止混乱

文章推荐

  • docker启动镜像常用参数示例

    一些常用Docker启动镜像参数的实际用法示例:-i: 保持STDIN打开,即使没有附加到容器上也可以使用。例如:docker run -i ubuntu /bin/bash-t: 为容器分配一个伪TTY终端。例如:docker run -t -i ubuntu /bin/bash-d: 在后台运行容器,并返回容器ID。例如:docker run -d ubuntu /bin/bash--name: 为容器指定一个名称。例如:docker run --name my_container_name ubuntu /bin/bash-p: 将容器内部的端口映射到主机上的某个端口。例如:docker run -p 8080:80 nginx-v: 将主机上的目录挂载到容器内部的某个目录。例如:docker run -v /host/path:/container/path nginx--link: 连接另一个容器。例如:docker run --link my_mysql_container:mysql_container nginx-e: 设置环境变量。例如:docker run -e ENV_VAR_NAME=env_var_value nginx-u: 设置容器的UID(用户标识符)。例如:docker run -u 1000 nginx--restart: 设置容器在退出时的重启策略。例如:docker run --restart always nginx--memory: 设置容器可以使用的内存大小。例如:docker run --memory=1g nginx--cpus: 设置容器可以使用的CPU数量。例如:docker run --cpus=2 nginx--network: 指定容器所在的网络。例如:docker run --network=my_network nginx-h: 设置容器的主机名。例如:docker run -h myhost nginx

  • spring cloud zuul

    新建zuul应用 注意:如果zuul不可选,需要降低一下spring boot版本添加eureka,跟config配置eureka: client: service-url: defaultZone: http://localhost:8761/eurekaspring: application: name: zuul cloud: config: discovery: enabled: true service-id: CONFIG_SERVER profile: dev在启动类添加配置使用其他端口访问:http://localhost:8081/test的接口使用zuul的端口访问(centos_blog是eureka上的应用名称,最好别用驼峰)相关配置屏蔽某些地址配置查看路由映射地址:http://localhost:9000/application/routes关闭过滤信息实现高可用,即把多个zuul应用部署到eureka上即可通过zuul对参数校验例子,请求必须带有token参数@Componentpublic class TokenFilter extends ZuulFilter { @Override public String filterType() { return PRE_TYPE; } @Override public int filterOrder() { //越小优先级越高 return PRE_DECORATION_FILTER_ORDER -1; } @Override public boolean shouldFilter() { return true; } @Override public Object run(){ RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); String token = request.getParameter("token"); if (StringUtils.isBlank(token)) { requestContext.setSendZuulResponse(false); requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); } return null; }}例子二,post请求返回,在head添加内容@Componentpublic class AddHeadFilter extends ZuulFilter { @Override public String filterType() { return POST_TYPE; } @Override public int filterOrder() { return SEND_RESPONSE_FILTER_ORDER - 1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletResponse httpResponse = requestContext.getResponse(); httpResponse.setHeader("abv", "asd"); return null; }}例子三:限流,用获取令牌的方式@Componentpublic class RateFilter extends ZuulFilter { //每秒放100个令牌 private static final RateLimiter RATE_LIMITER = RateLimiter.create(100); @Override public String filterType() { //优先级最高 return PRE_TYPE; } @Override public int filterOrder() { return SERVLET_DETECTION_FILTER_ORDER - 1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { //如果没有令牌 if(!RATE_LIMITER.tryAcquire()) { throw new RuntimeException("没有获取令牌"); } return null; }}统一去除所有敏感头过滤例子四:权限控制@Componentpublic class AuthFilter extends ZuulFilter { @Override public String filterType() { return PRE_TYPE; } @Override public int filterOrder() { //越小优先级越高 return PRE_DECORATION_FILTER_ORDER -1; } @Override public boolean shouldFilter() { //是否进行拦截 RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); //可改成数据库配置,从redis读取 if("/login".equals(request.getRequestURI())) { return false; } return true; } @Override public Object run(){ //拦截处理 //可不同角色新建不同的filter RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); if (StringUtils.isNotBlank(request.getHeader("token"))) { throw new RuntimeException("拦截"); } return null; }}例子5,跨域@Configurationpublic class CorsConfig { @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); final CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.setAllowedOrigins(Collections.singletonList("*")); config.setAllowedHeaders(Collections.singletonList("*")); config.setAllowedMethods(Collections.singletonList("*")); config.setMaxAge(300L); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); }}

  • nginx常用配置

    Nginx是一款高性能的Web服务器软件,常用于反向代理、负载均衡、静态资源服务等方面。以下是Nginx常用的配置:配置监听端口:listen 80; 配置网站根目录:root /var/www/html; 配置虚拟主机:server { listen 80; server_name example.com; root /var/www/example.com; } 配置负载均衡:upstream backend { server backend1.example.com; server backend2.example.com; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; } } 配置HTTPS:server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://backend; } }