WeText项目的服务端

在《WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例》文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Framework 4.6.1)开发的DDD/CQRS/微服务架构的案例项目:WeText。文章发出后反响很好,也很感谢大家的关注。在本文中我将介绍如何在Ubuntu 14.04.4 LTS中运行WeText项目的服务端。

为跨平台而生

从一开始的设计,我就把WeText的服务端跨平台纳入了实践目标,因此,所选择的框架和技术全部都是可以跨平台运行的。在这个过程中我没有尝试最新的.NET Core RC,而是继续使用最新版本的Mono。Mono目前对微软官方的.NET Framework兼容性已经做得非常好了,一句话概括:除了WPF、WWF不支持,以及部分WCF与ASP.NET 4.5异步支持不完善以外,其它功能完全支持。.NET Framework已经支持到4.6.1,C#语言规范已经支持到C# 6.0。具体详情可以参考Mono的官方说明:http://www.mono-project.com/docs/about-mono/compatibility/。在最近工作上遇到一个项目需要能够运行在Linux下,项目本身不大,也非常简单,但美国团队一听说我打算采用Mono就不太愿意接受,最后还是选择使用Java。当然我承认Java在多平台的支持方面的确非常出色,但我还是想亲身实践一下Mono,想证明基于Mono的方案的确也能做得很好。这也是我将WeText定位为能够跨平台的一个原因吧。话说回来,从客户的角度,微软的开源为解决方案的技术选型提供了更为广阔的选择余地,客户的整套方案不需要像以前那样,一个部分使用了微软技术,就整个解决方案都要使用微软技术(比如,选择了.NET Framework,就需要运行Windows的服务器;使用了Windows服务器,LDAP就是Active Directory最合适;使用Entity Framework,就需要SQL Server做数据库,客户一想,我还有一大堆的服务程序都是运行于Linux的,凭什么我的服务器一定要选择Windows?于是,客户也不会选择.NET Framework)。当然,这是另外的话题,在这里我还是继续介绍WeText服务端的跨平台特性吧。

我在Ubuntu 14.04.4 LTS版本的Linux系统中成功安装并运行了WeText的服务端,而且成功从Windows下的WeText.Web项目访问这台Linux服务器并跑通了所有的业务逻辑。听起来是不是很让人兴奋?现在,就请和我一起了解一下整个安装和运行过程吧。

环境准备

首先,得要有一台Ubuntu 14.04.4 LTS的机器(如果是其它系列的Linux,以下安装过程会有些不同,请大家自行参考各种组件在相应版本的Linux下的安装步骤进行安装,但不会影响后续WeText的编译和执行)。在准备完这台机器之后,就可以开始一步步地准备环境了。

安装Mono

在Linux系统中安装Mono,可以参考http://www.mono-project.com/docs/compiling-mono/linux/。基本上有两种方式:一种是直接从发布版本进行编译安装,另一种是通过克隆代码库然后编译安装。当然,无论哪种方式,在编译之前,请先通过下面的命令确保所有所需的软件包都已经正确安装:

1
sudo apt-get install git autoconf libtool automake build-essential mono-devel gettext

我自己是通过下载Release Package完成安装的,Mono所有的Release Package位于:http://download.mono-project.com/sources/mono/。直接选择最新版本下载解压即可。

解压完成后,进入解压后的目录,依次执行下面的命令完成编译安装:

1
2
3
./configure --prefix=/usr/local
make
make install

第一条命令中的—prefix参数可以根据自己的情况设定。

安装MongoDB

在WeText中,MongoDB被用作Event Store(事实上Event Sourcing暂时还未实现)。使用MongoDB的原因,是因为事件数据本身是非结构化的,而且MongoDB在replication方面有着很好的解决方案。安装过程如下:

1. 为包管理系统导入公钥

1
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

2. 为MongoDB创建list文件

这将为MongoDB在/etc/apt/sources.list.d目录下创建mongodb-org-3.2.list文件。

1
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

3. 刷新本地包数据库

1
sudo apt-get update

4. 安装最新版本的MongoDB

1
sudo apt-get install -y mongodb-org

5. 启动MongoDB服务

1
sudo service mongod start

6. 直接执行mongo命令,检查MongoDB是否已经正确安装

如果需要更加详细的安装步骤,请直接参考官方文档,或者也可以上网搜索相关的中文资料参考。注意:目前暂时建议整个安装过程采用默认设置,因为MongoDB的配置目前是写死在服务端代码中的(具体位置是:WeText.DomainRepositories项目下的WeTextMongoSetting.cs文件中)。如果更改了MongoDB的配置,那么也需要相应地更改这部分代码,然后重新编译WeText服务端(本文后半部分会介绍编译过程)。今后会将MongoDB的配置移到配置文件中。

安装RabbitMQ

1. 使用以下命令将RabbitMQ的APT Repository加到/etc/apt/sources.list.d目录下

1
echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list

2. 将RabbitMQ的公钥加入受信秘钥列表中

3. 刷新本地包数据库

1
sudo apt-get update

4. 安装RabbitMQ

1
sudo apt-get install rabbitmq-server

如果需要更加详细的安装步骤,请直接参考官方文档

安装MySQL

1. 刷新本地包数据库

1
sudo apt-get update

2. 安装MySQL

1
sudo apt-get install mysql-server

3. 使用以下命令尝试连接MySQL服务

1
mysql -u root -p

如果需要更加详细的安装步骤,请直接参考这篇文章

从源代码编译

1. 使用下面的git命令将WeText源代码克隆到本地

2. 进入we-text\scripts目录,执行mysql –u root –p命令启动MySQL客户端。并在MySQL中执行下面的命令,初始化WeText所需使用的查询数据库:

1
\. mysql_query_databases.sql

3. 注意:在Linux下的nuget.exe还是有些问题,在WeText下执行nuget.exe restore命令无法将所有的依赖库下载下来(我还没找到解决方案)。因此,只能在Windows中先使用Visual Studio 2015编译WeText.sln,然后再将下载下来的packages目录复制到Linux下we-text\src目录下。可以通过Samba服务,或者使用FTP将packages目录上传到Linux系统中

4. 进入we-text\src目录,使用下面的命令完成WeText服务端的编译:

1
xbuild /p:TargetFrameworkVersion=v4.6.1 /p:Configuration=ServerDebug WeText.sln

5. 编译完成后,会出现一些Assembly Binding的警告,请暂且忽略

运行WeText服务端

进入we-text\bin目录,执行./WeText.Service.exe命令,启动WeText服务端,将看到以下画面:

在Windows中通过Visual Studio 2015打开WeText项目,修改WeText.Web项目的web.config文件,将下图中的设置更改为Linux中的WeText服务端地址:

启动WeText.Web项目,新建一个daxnet的用户:

登录后点击菜单栏的My Texts菜单,创建一个新的Text:

现在,查看Linux下的MongoDB数据库:

查看MySQL查询数据库:

查看RabbitMQ消息队列:

OK,整个流程运行下来没什么问题。最后,只要在WeText.Service.exe的窗口中直接回车,即可退出服务端的运行(退出需要花几秒钟时间)。

总结

本文详细介绍了在Linux环境中编译运行WeText客户端的方法,并成功走通了整个流程。正如前文所述,WeText还有很多需要改进的地方,我也会一步步对其进行改进调整,如果有新的心得体会,我也会继续分享给大家。

WeText项目的服务端的更多相关文章

  1. 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端

    在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...

  2. react 项目实战(一)创建项目 及 服务端搭建

    1.安装 React社区提供了众多的脚手架,这里我们使用官方推荐的create-react-app. //安装脚手架 npm install -g create-react-app //生成并运行项目 ...

  3. 改造@vue/cli项目为服务端渲染-ServerSideRender

    VUE SEO方案二 - SSR服务端渲染 在上一章中,我们分享了预渲染的方案来解决SEO问题,个人还是很中意此方案的,既简单又能解决大部分问题.但是也有着一定的缺陷,所以我们继续来看下一个方案--服 ...

  4. 基于vue-cli项目添加服务端渲染

    两个示例的git地址: 1. 我的环境 2. 方式一:使用prerender-spa-plugin插件获得SSR的效果. 2.1 说明 2.2 初始化 1 vue init webpack vue-p ...

  5. 如何使用Vue2做服务端渲染

    花费了一个月时间,终于在新养车之家项目中成功部署了vue2服务端渲染(SSR),并且使用上了Vuex 负责状态管理,首屏加载时间从之前4G网络下的1000ms,提升到了现在500-700ms之间,SS ...

  6. Egg + Vue 服务端渲染工程化实现

    在实现 egg + vue 服务端渲染工程化实现之前,我们先来看看前面两篇关于Webpack构建和Egg的文章: 在 Webpack工程化解决方案easywebpack 文章中我们提到了基于 Vue ...

  7. Vue(服务端渲染)

    一.前言 1.服务端渲染图解                                                 2.简介服务端渲染                             ...

  8. Vue2服务端渲染

    Vue2 服务端渲染 花费了一个月时间,终于在新养车之家项目中成功部署了vue2服务端渲染(SSR),并且使用上了Vuex 负责状态管理,首屏加载时间从之前4G网络下的1000ms,提升到了现在500 ...

  9. Android 小例子服务端

    这是之前发布的Android项目的服务端源码,只是简单的根据请求返回了一些测试数据,没有实现对数据库的操作,可以根据需求自己实现. 这是mvc4 WebAPI项目,需要用vs2012打开. 如果是用的 ...

随机推荐

  1. redisTemplate 操作

    redisDao封装类-其他dao集成他 package com.ffcs.wlan.dao.common; import javax.annotation.Resource; import org. ...

  2. 基于visual Studio2013解决面试题之1403插入排序

     题目

  3. C# c++ 传递函数指针

    C#和c++之间相互传递函数指针 在C++和C#之中都有很多callback method,可以相互调用吗,怎么传递,是我表弟的问题. 1.定义c++ dll ,导出方法 // sort.cpp : ...

  4. Study notes for Latent Dirichlet Allocation

    1. Topic Models Topic models are based upon the idea that documents are mixtures of topics, where a ...

  5. PHP $_SERVER

    $_SERVER 是一个包括了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组.这个数组中的项目由 Web server创建.不能保证每一个 ...

  6. asp.net2.0安全性(1)--用户角色篇(代码实现2)--转载来自车老师

    加载所有用户 MembershipUserCollection user = Membership.GetAllUsers(); listUser.DataSource = user; listUse ...

  7. 写程序取自己进程的AEP

    测试程序功能 打印出自己进程的程序入口点地址. 结合OD载入程序,看到的入口点确实是0x004014f0, 说明程序入口点找到了 测试程序 /// @file exam_1_1.c #include  ...

  8. hbase:应用开发

    开发环境: hadoop: hadoop-1.1.2 hbase: hbase-0.94.11-security eclipse:Juno Service Release 2 配置Eclipse 通过 ...

  9. 一道c++小编程题,

    题目: 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词,程序应该找出满足以下条件的单词的输入位置:该单词的后面紧跟着再次出现自己本身,跟 踪重复次数量多的单词及其重复次数 ...

  10. Windows Azure 安全最佳实践 - 第 3 部分:确定安全框架

    构建云应用程序时,安全始终是计划和执行Windows Azure的首要核心因素.第 1 部分提出安全是一项共同责任,Windows Azure为您的应用程序提供超出内部部署应用程序需求的强大安全功能. ...