Windows下Git Server的搭建

  categories:资料  author:

一直以来, 一直在用svn做为版本系统, 最近几年git异常流行, 看来到了必须学习一下的时刻了, 若是为了学习而学习, 学了,然后时间长了不用, 估计也就忘记了, 因此必须应用到实际环境中。

初步考虑在家里的一个pc上安装git 的server, 然后把个人的资料, 分布在笔记本上, 其他机器上的资料通过git都做版本化, 这样由于数据, 在笔记本上保存一份本地副本, 在gitserver上也存在一份, 可以充分防止丢失。

另外利用git等的版本化功能, 可以分析数据的变化情况等, 做好历史记录, 即使有重名的数据, 重复的文件, 数据的删除等都可以通过历史等进行显示和管理等。

为此上网收集了一些资料, 参照进行了实践, 资料记录如下:

 Windows下Git Server的搭建

人一多,就有江湖,还有一些奇奇怪怪的需求,比如,要在Windows平台下搭建Git Server。我的第一想法是在Windows上跑虚拟机,虚拟机里跑Linux,Linux上跑Git Server,完美!
人最怕的就是追问,为什么不在Windows上直接跑应用呢?于是就有了本文。
搜索下,其实Windows下Git Server的软件还是挺多的,这里有一篇博文就记载了18种之多,我也是接受他的推荐,选择了SCM-MANAGER,官网地址:https://www.scm-manager.org

SCM-MANAGER的安装

小套路:安装一个软件,你至少要:
1. 看一下它的官网;
2. 了解下它的软硬件及环境要求;

阅读全文

ifconfig命令详解

  categories:资料  author:

参数
-a 显示全部接口信息

[root@controller hello]# ifconfig -a
enp0s3: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet 192.168.10.202 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::a00:27ff:febc:4068 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:bc:40:68 txqueuelen 1000 (Ethernet)
RX packets 132991 bytes 86829278 (82.8 MiB)
RX errors 0 dropped 0 … 阅读全文

VisualSVN Server+Trac集成安装

  categories:资料  author:

团队开发过程中,Subversion是首选的源码版本控制软件,Trac是基于网页界面的项目管理和缺陷最终的软件,最重要的是它们都是开源的。

  • Subversion在linux下配置较为繁琐,幸好Windows下有免费的VisualSVN Server可以使用,它简化了安装,提供简单的下一步安装方式。具体下载地址
  • Trac官方网站提供了下载,但要与VisualSVN Server集成,最好从VisualSVN网站上下载Trac软件。具体下载地址。安装说明是英文的。
  • 有朋友问到如何给用户加Admin权限,具体见文章底部。

</ul> </div> 下面介绍一下VisualSVN Server+Trac集成安装具体步骤:

    1. 下载VisualSVN Server 2.6.4或以上版本。 VisualSVN Server+Trac集成安装(图文版)VisualSVN Server+Trac集成安装(图文版)
    2. 使用默认的设置安装,如果端口443冲突就换成8443,没有域服务器(一般都是对等网)的选择Subversion认证方式。
    3. 安装成功后,打开VisualSVN Server Manager,新建版本库,例如MyProject(这里改成你自己的项目名,记住下面所有的操作中只要有MyProject,都要替换成你自己的项目名) VisualSVN Server+Trac集成安装(图文版)VisualSVN Server+Trac集成安装(图文版)VisualSVN Server+Trac集成安装(图文版)
    4. 使用Subversion认证方式,至少要创建一个用户。 VisualSVN Server+Trac集成安装(图文版)
    5. 下载Trac,网址同上:trac+subversion集成安装包 VisualSVN Server+Trac集成安装(图文版)VisualSVN Server+Trac集成安装(图文版)VisualSVN Server+Trac集成安装(图文版)
    6. 解压到 %VISUALSVN_SERVER% 目录,一般为:C:\Program Files\VisualSVN Server VisualSVN Server+Trac集成安装(图文版)
    7. 创建C:\Trac目录(可更换为其它目录,但下面的C:\Trac都要替换成你自己的目录)
    8. C:\Trac目录的安全性设置:增加Network Service用户,权限为完全控制 VisualSVN Server+Trac集成安装(图文版)
    9. 打开命令行窗口(运行 cmd),执行:”%VISUALSVN_SERVER%trac\trac-admin.bat” C:\Trac\MyProject initenv 注意:如果你的项目名不是MyProject,目录不在C:\Trac,一定要替换成你自己的,下面的也类似,不再重复。 VisualSVN Server+Trac集成安装(图文版)VisualSVN Server+Trac集成安装(图文版)VisualSVN Server+Trac集成安装(图文版)
    10. 继续执行下面的命令,用来集成Trac项目与具体的Subversion项目连接。”%VISUALSVN_SERVER%trac\trac- admin.bat” c:\Trac\MyProject repository add
阅读全文

图形数据库Neo4J简介

  categories:资料  author:

最近我在用图形数据库来完成对一个初创项目的支持。在使用过程中觉得这种图形数据库实际上挺有意思的。因此在这里给大家做一个简单的介绍。

NoSQL数据库相信大家都听说过。它们常常可以用来处理传统的关系型数据库所难以解决的一系列问题。通常情况下,这些NoSQL数据库分为Graph,Document,Column Family以及Key-Value Store等四种。这四种类型的数据库分别使用了不同的数据结构来记录数据。因此它们所适用的场景也不尽相同。

其中最为特别的便是图形数据库了。可以说,它和其它的一系列NoSQL数据库非常不同:丰富的关系表示,完整的事务支持,却没有一个纯正的横向扩展解决方案。

在本文中,我们就将对业界非常流行的图形数据库Neo4J进行简单的介绍。

 

图形数据库简介

相信您和我一样,在使用关系型数据库时常常会遇到一系列非常复杂的设计问题。例如一部电影中的各个演员常常有主角配角之分,还要有导演,特效等人员的参与。通常情况下这些人员常常都被抽象为Person类型,对应着同一个数据库表。同时一位导演本身也可以是其它电影或者电视剧的演员,更可能是歌手,甚至是某些影视公司的投资者(没错,我这个例子的确是以赵薇为模板的)。而这些影视公司则常常是一系列电影,电视剧的资方。这种彼此关联的关系常常会非常复杂,而且在两个实体之间常常同时存在着多个不同的关系:

在尝试使用关系型数据库对这些关系进行建模时,我们首先需要建立表示各种实体的一系列表:表示人的表,表示电影的表,表示电视剧的表,表示影视公司的表等等。这些表常常需要通过一系列关联表将它们关联起来:通过这些关联表来记录一个人到底参演过哪些电影,参演过哪些电视剧,唱过哪些歌,同时又是哪些公司的投资方。同时我们还需要创建一系列关联表来记录一部电影中哪些人是主角,哪些人是配角,哪个人是导演,哪些人是特效等。可以看到,我们需要大量的关联表来记录这一系列复杂的关系。在更多实体引入之后,我们将需要越来越多的关联表,从而使得基于关系型数据库的解决方案繁琐易错。

这一切的症结主要在于关系型数据库是以为实体建模这一基础理念设计的。该设计理念并没有提供对这些实体间关系的直接支持。在需要描述这些实体之间的关系时,我们常常需要创建一个关联表以记录这些数据之间的关联关系,而且这些关联表常常不用来记录除外键之外的其它数据。也就是说,这些关联表也仅仅是通过关系型数据库所已有的功能来模拟实体之间的关系。这种模拟导致了两个非常糟糕的结果:数据库需要通过关联表间接地维护实体间的关系,导致数据库的执行效能低下;同时关联表的数量急剧上升。

这种执行效能到底低下到什么程度呢?就以建立人和电影之间的投资关系为例。一个使用关联表的设计常常如下所示:

如果现在我们想要通过该关系找到一部电影的所有投资人,关系型数据库常常会执行哪些操作呢?首先,在关联表中执行一个Table Scan操作(假设没有得到索引支持),以找到所有film域的值与目标电影id相匹配的记录。接下来,通过这些记录中的person域所记录的Person的主键值来从Person表中找到相应的记录。如果记录较少,那么这步就会使用Clustered Index Seek操作(假设是使用该运算符)。整个操作的时间复杂度将变为O(nlogn):

可以看到,通过关联表组织的关系在运行时的性能并不是很好。如果我们所需要操作的数据集包含了非常多的关系,而且主要是在对这些关系进行操作,那么可以想象到关系数据库的性能将变得有多差。

除了性能之外,关联表数量的管理也是一个非常让人头疼的问题。刚刚我们仅仅是举了一个具有四个实体的例子:人,电影,电视剧,影视公司。现实生活中的例子可不是这么简单。在一些场景下,我们常常需要对更多的实体进行建模,从而完整地描述某一领域内的关联关系。这种关联关系所涵盖的可能包含影视公司的控股关系,各控股公司之间复杂的持股关系以及各公司之间的借贷款情况及担保关系等,更可能是人之间的关系,人与各个品牌之间的代言关系,各个品牌与所属公司之间的关系等。

可以看到,在需要描述大量关系时,传统的关系型数据库已经不堪重负。它所能承担的是较多实体但是实体间关系略显简单的情况。而对于这种实体间关系非常复杂,常常需要在关系之中记录数据,而且大部分对数据的操作都与关系有关的情况,原生支持了关系的图形数据库才是正确的选择。它不仅仅可以为我们带来运行性能的提升,更可以大大提高系统开发效率,减少维护成本。

在一个图形数据库中,数据库的最主要组成主要有两种,结点集和连接结点的关系。结点集就是图中一系列结点的集合,比较接近于关系数据库中所最常使用的表。而关系则是图形数据库所特有的组成。因此对于一个习惯于使用关系型数据库开发的人而言,如何正确地理解关系则是正确使用图形数据库的关键。

注:这里的结点集是我自己的翻译。在Neo4J官方文档中,其被称为label。原文为:A label is a named graph construct that is used to group nodes into sets; all nodes labeled with the … 阅读全文

授权管理-LDAP-介绍与环境搭建

  categories:资料  author:

最近研究ldap, 看到一个好的文章, 记录如下

LDAP介绍

还是先来百度百科介绍。

LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。

以前我也就听了一下公司里主要是用来存放用户的信息,然后用来做统一认证的。ldap协议是一个标准解析,所以好多开源软件都支持ldap,gerrit,gitlab,redmine,jenkins等等等,好多好多。我这个专题主要是面向开源的系统,所以ldap是一个基础。

先来个图:

PS:安装的是否我选择的是LDIF存储格式。

大概就是这样,存储就像一棵树一样,一级一级的,最里面的那层存储的最详细的信息。例如:

dc=maxcrc,dc=com—— maxcrc公司

ou=people——people部门

cn=devops+displayName….uid=100001+user——这个是员工的具体信息

dc, ou,cn, uid都有明确的定义,而且是标准的。这个我们会在ldap schema文件里再说明一下。

网上关于ldap的文章也很多,ldap还有好多的高级用法,可以用来管理好多的数据,最基本的功能就是存储信息。

如果想要深入学习的,可以下载这本书下来看看 《Linux+UNIX+OpenLDAP实战指南》  密码:cdjj

感觉还可以。

优点:

1. 速度快,分布式。

2. 标准协议,可以适用在很多场景,而且集成成本低。

3. 是一个非常成熟的产品,网上的资料,用法都很多,学习成本低(不过开发的可能了解的不多,偏运维应该是了解得透透的吧)

LDAP环境搭建

hub镜像地址: osixia/openldap

github地址:https://github.com/osixia/docker-openldap 这上面会对此docker镜像有明确的说明,包括如何运行。各种场景都有,请好好阅读。

下载docker镜像命令:docker

阅读全文

奋斗的一生

  categories:成长, 资料  author:

为什么写一个奋斗的一生?

先蹭一个热度!

一。与人的竞争

如下图

新闻来源: https://news.sina.com.cn/c/2019-05-14/doc-ihvhiews1772880.shtml

这个新闻 估计已经不新鲜了, 贸易战已经打了很久了, 贸易战对大家都没啥好处, 基本上两败俱伤,这些都不是我们要讨论的, 那些留给后人或者智者吧

下面在看另外一个

新闻来源:https://news.sina.com.cn/c/2019-05-14/doc-ihvhiqax8582048.shtml

这个真是闭门家中做,事从天上来, 人家打到家门口了

这些都是国家大事, 不是我们今天的重点, 我们重点是说一下这个引出的一个问题!

就是: 激烈的竞争, 当人家看到 你日子过得好了后, 人家自然不平衡, 自然想办法在你的锅里面给你放点东西, 恶心你, 管能否有作用, 人家就是要恶心你。

一句话, 我们生活在一定的竞争中, 你不自觉的 被参与其中了!  不要逃避, 无处逃避!

既然无处逃避, 只能迎难而上了, 否则就任人宰割了!   当然这个不是本文的重点。

 

二。

阅读全文

spring-session实现分布式集群session的共享

  categories:资料  author:

前言

  HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。但是我们把应用搭建成分布式的集群,然后利用LVS或Nginx做负载均衡,那么来自同一用户的Http请求将有可能被分发到多个不同的应用中。那问题来了,如何保证不同的应用能够共享同一份session数据呢?最简单的想法,就是把session数据保存到内存以外的一个统一的地方,例如Memcached/Redis等数据库中。那问题又来了,如何替换掉Servlet容器创建和管理的HttpSession的实现呢?

1、利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略。这方面其实早就有开源项目了,例如memcached-session-manager(可以参考负载均衡+session共享(memcached-session-manager实现),以及tomcat-redis-session-manager。不过这种方式有个缺点,就是需要耦合Tomcat/Jetty等Servlet容器的代码。

2、设计一个Filter,利用HttpServletRequestWrapper,实现自己的 getSession()方法,接管创建和管理Session数据的工作。spring-session就是通过这样的思路实现的。

参考 spring-session之一 初探 spring-session

本博客不涉及session解释,关于session大家自行去查资料;关于spring-session的相关概念大家可以去spring官网查阅(http://projects.spring.io/spring-session/)。

单机应用

我们先来看下单机应用,应用很简单,就是在session中设置变量,然后获取这些设置的变量进行展示 ,具体代码如下

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yzb.lee</groupId>
    <artifactId>spring-session</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-session Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        
        
阅读全文

从零开始的Spring Session

  categories:资料  author:

Session和Cookie这两个概念,在学习java web开发之初,大多数人就已经接触过了。最近在研究跨域单点登录的实现时,发现对于Session和Cookie的了解,并不是很深入,所以打算写两篇文章记录一下自己的理解。在我们的应用集成Spring Session之前,先补充一点Session和Cookie的关键知识。

Session与Cookie基础

由于http协议是无状态的协议,为了能够记住请求的状态,于是引入了Session和Cookie的机制。我们应该有一个很明确的概念,那就是Session是存在于服务器端的,在单体式应用中,他是由tomcat管理的,存在于tomcat的内存中,当我们为了解决分布式场景中的session共享问题时,引入了redis,其共享内存,以及支持key自动过期的特性,非常契合session的特性,我们在企业开发中最常用的也就是这种模式。但是只要你愿意,也可以选择存储在JDBC,Mongo中,这些,spring都提供了默认的实现,在大多数情况下,我们只需要引入配置即可。而Cookie则是存在于客户端,更方便理解的说法,可以说存在于浏览器。Cookie并不常用,至少在我不长的web开发生涯中,并没有什么场景需要我过多的关注Cookie。http协议允许从服务器返回Response时携带一些Cookie,并且同一个域下对Cookie的数量有所限制,之前说过Session的持久化依赖于服务端的策略,而Cookie的持久化则是依赖于本地文件。虽然说Cookie并不常用,但是有一类特殊的Cookie却是我们需要额外关注的,那便是与Session相关的sessionId,他是真正维系客户端和服务端的桥梁。

代码示例

用户发起请求,服务器响应请求,并做一些用户信息的处理,随后返回响应给用户;用户再次发起请求,携带sessionId,服务器便能够识别,这个用户就是之前请求的那个。

使用Springboot编写一个非常简单的服务端,来加深对其的理解。需求很简单,当浏览器访问localhost:8080/test/cookie?browser=xxx时,如果没有获取到session,则将request中的browser存入session;如果获取到session,便将session中的browser值输出。顺便将request中的所有cookie打印出来。

@Controller
public class CookieController {

    @RequestMapping("/test/cookie")
    public String cookie(@RequestParam("browser") String browser, HttpServletRequest request, HttpSession session) {
        //取出session中的browser
        Object sessionBrowser = session.getAttribute("browser");
        if
阅读全文

在Spring Boot中使用Spring Session解决分布式会话共享问题

  categories:资料  author:

前言

如果你正在使用Java开发Web应用,想必你对HttpSession非常熟悉,但我们知道HpptSession默认使用内存来管理Session,如果将应用横向扩展将会出现Session共享问题。Spring Session提供了一套创建和管理Servlet HttpSession的方案,以此来解决Session共享的问题,更为重要的是在Spring Boot中使用它极其简单。

Session共享的问题

HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。如果我们将Web应用横向扩展搭建成分布式的集群,然后利用LVS或Nginx做负载均衡,那么来自同一用户的Http请求将有可能被负载分发到两个不同的实例中去,如何保证不同实例间Session共享成为一个不得不解决的问题。

最简单的解决方法就是把Session数据保存到内存以外的一个统一的地方,例如Memcached/Redis中。那么问题又来了,如何替换掉Servlet容器创建和管理HttpSession的实现呢?

  1. 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略。不过这种方式有个缺点,就是需要耦合Tomcat/Jetty等Servlet容器的代码。这方面其实早就有开源项目了,例如memcached-session-manager,以及tomcat-redis-session-manager。暂时都只支持Tomcat6/Tomcat7。
  2. 配置Nginx的负载均衡算法为ip_hash,这样每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的Session共享问题
  3. 如果你使用Shiro管理Session,可以用Redis来实现Shiro 的SessionDao接口,这样Session便归Redis保管。
  4. 设计一个Filter,利用HttpServletRequestWrapper,实现自己的 getSession()方法,接管创建和管理Session数据的工作。Spring-Session就是通过这样的思路实现的。

在Spring Boot中 集成 Spring Session

Spring Session 支持使用Redis、Mongo、JDBC、Hazelcast来存储Session,这里以Redis为例。

  1. 引入Maven依赖(本示例使用dependencyManagement,如果你没有使用它请添加<version>标签)
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>
阅读全文

Spring Boot集成Hazelcast实现集群与分布式内存缓存

  categories:资料  author:

Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品,提供弹性可扩展、高性能的分布式内存计算。并通过提供诸如Map,Queue,ExecutorService,Lock和JCache等Java的许多开发人员友好的分布式实现。

了解Hazelcast
Hazelcast特性

简单易用
Hazelcast是用Java编写的,没有其他依赖关系。只需简单的把jar包引入项目的classpath即可创建集群。
无主从模式
与许多NoSQL解决方案不同,Hazelcast节点是点对点的。没有主从关系; 所有成员都存储相同数量的数据,并进行相等的处理,避免了单点故障。
弹性可扩展
Hazelcast旨在扩展成千上万的成员。新成员启动,将自动发现群集,并线性增加存储和处理能力。成员之间通过TCP保持连接和通讯。
读写快速高效
Hazelcast所有数据都存储在内存中,提供基于内存快速高效的读写能力。
Hazelcast部署拓扑
在Hazelcast官方提供两种方式部署集群(图片均来自官方文档):
如需聚焦异步或高性能大批量任务的缓存服务,嵌入式方式是相对有优势的,最明显嵌入式方式访问数据延迟性低。
独立创建Hazelcast集群,统一管理,所有的应用程序如果需要访问缓存,可通过Hazelcast客户端(有java .NET C++的实现)或Memcache客户端或简单的REST客户端访问。后续demo示例以嵌入式为例。

Hazelcast数据分区
在Hazelcast分布式环境中,默认情况下,Hazelcast有271个分区。
当启动第一个成员的时候,成员1在集群中的分区如下图:
当在集群中新添加一个节点2时,分区图如下:
在图示中,黑色分区是主分区,蓝色分区是副本分区(备份)。第一个成员具有135个主分区(黑色),并且每个分区都备份在第二个成员(蓝色)中。同时,第一个成员还具有第二个成员的主分区的副本分区。

随着成员的增多,Hazelcast将一些主要和副本分区逐个移动到新成员,使所有成员相等和冗余。只有最小量的分区将被移动到扩展Hazelcast。以下是具有四个成员的Hazelcast集群中的分区图示如下:
Hazelcast在群集成员之间平均分配分区。Hazelcast创建分区的备份,并将其分配给成员之间进行冗余。

上述插图中的分区是为了方便描述。通常,Hazelcast分区不会按照顺序分配(如这些图所示),而是随机分布。Hazelcast在成员间平均分配了分区和备份。

Hazelcast优势

Hazelcast提供开源版本。
Hazelcast无需安装,只是个极小jar包。
Hazelcast提供开箱即用的分布式数据结构,如Map,Queue,MultiMap,Topic,Lock和Executor。
Hazelcast集群非传统主从关系,避免了单点故障;集群中所有成员共同分担集群功能。
Hazelcast集群提供弹性扩展,新成员在内存不足或负载过高时能动态加入集群。
Hazelcast集群中成员分担数据缓存的同时互相冗余备份其他成员数据,防止某成员离线后数据丢失。
Hazelcast提供SPI接口支持用户自定义分布式数据结构。
Hazelcast适用场景

频繁读写数据
需要高可用分布式缓存
内存行NoSql存储
分布式环境中弹性扩展
下面我们来使用Spring … 阅读全文



快乐成长 每天进步一点点      京ICP备18032580号-1