新建webapi项目
新建student控制器,测试运行
添加新项目控制台应用程序,加入model类
删除program.cs文件,右键属性,修改输出类型为“类库”
继续新建项目,interface,作为服务的接口
删除program.cs文件,继续修改属性为类库
定义完了接口,接下来应该定义实现接口的具体服务了,新建控制台应用程序
编写DBhelper类,原生连接数据库
添加StudentService实现类,继承IStudentService,实现它未实现的方法
依然重复上述步骤,右键属性,修改输出类型为类库
测试,以上依然是个单体结构,只不过分层了,现在我们搭了基层结构如图:
分别为,webapi,接口,模型层,接口实现类
接下来修改webapi内student控制层里的方法,尝试调用通过接口调用服务,进而获取数据库中的数据
修改前:
修改后:
先在startup.cs中进行服务类的依赖注入
在这里,我们对controller进行重新构造:
定义一个私有只读IStudentService接口 ;
在构造函数里为它赋值
在GetAllStu方法里进行调用
启动试试,输入url
不错不错
接下来我们要添加服务实例,将原来的单体应用程序,模拟拆分成分布式应用程序
新建项目,新建webapi
新建新的控制器,为了和上面的student控制器区分,且,我们要知道,最后上面将作为客户端,调用我们现在正在搭建的服务实例,这个项目,所以真正会和接口、服务、数据库打交道的应该在我们现在搭建的这个控制器里面,在这里我取名为StuImplController控制器。
在这里面,复制之前的studentcontroller里的内容,作为真正调用的源头
同时,别忘记了,要正常使用,记得在该项目内startup.cs中增加依赖注入
修改启动项目为该服务实例,我们先试试看能不能跑
nice
接下来我们做分布式应用程序:我们希望LjsMicroServiceReviewDemo通过ServiceInstance去调用,这样子,前者就可以作为客户端,后者就可以作为服务端,因为是进程间通信,虽然在一台电脑上跑,但是可以理解为是利用网络架起的桥梁,进行分布式应用的部署和调用。
这时候记录一下网址
http://localhost:42464/api/StuImpl/GetAllStu
在客户端,写一个调用方法,调用刚刚的网址嘿嘿
同时启动两个项目,让他搞去吧
爽爆了!
但是还不够,我们知道,一般情况下,服务器里怎么可能只有一个服务实例在跑呢,那双十一不是炸裂,所以这时候会有很多实例在跑才对,例如两个、三个相同的实例一起运行,同时对外提供服务才对。
我们要使用命令行运行服务实例,并且赋予相应的端口号
在地址栏敲cmd
开启三个服务实例,端口为5726、5727、5728
为了验证,可以在浏览器试试
nice
这时候,客户端调用的url就得改成上述网址了
你有种调用我试试
可是我们做不到负载均衡呀,就是我们不晓得怎么调用5726还是5727还是5728嘞,这时候就要引入Nginx啦!
下载Nginx和环境变量的配置就不过多赘述了
修改conf文件
配置端口侦听
配置代理端口号
最后我们打算舍弃传统的调用方式,寄希望于Nginx反向代理工具来帮我们实现一些负载均衡的策略
启动Nginx.exe
启动客户端程序,跑一跑
问题不大,但是这时候又有个问题了,如果某个服务突然挂了怎么办呢,如果有个服务因为预计可能会有大规模的访问,运维人员又加上了几个服务实例呢,这时候就需要我们手动在conf的配置文件里进行配置,这样十分的低效,假如你在一家超大型的互联网公司,就GG了,所以这时候我们要用consul来替代Nginx
nuget包必不可少
同样在服务实例项目里也要引入consul包
在服务实例项目中,加入帮助类,心跳检测控制器,并在startup.cs中配置
在ReviewDemo中也要注册并使用
配置完毕后要激活consul,重新生成才行
启动成功,接着让三个服务实例上线
其实这时候我们不知道如何做负载均衡,如果要做的话,也带在客户端做负载均衡,这样每个客户端都要做一个,就很麻烦,没有什么是加一层不能解决的,所以我们加一层服务网关,Ocelot,用于请求分发、统一负载均衡、熔断、限流、降级
我们继续创建新项目:webapi
引入nuget包,ocelot用于服务网关,consul用于网关和注册中心的集成,polly用于熔断、限流、降级等
当然,在服务实例层也要加入ocelot.provider.consul,否则ocelot怎么知道服务实例从哪里来呢对吧,好了我们再回到gateway层
在program.cs文件中添加配置的json文件
在startup.cs文件中把管道换成ocelot自己的
配置文件
给她一个运行端口
跑一跑
结束了嗷,下个阶段的内容应该是,CQRS命令查询职责分离,以及以及以及数据库如何划分,以及以及以及Rabbitmq以及基于事件的驱动。