手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)
背景
公司去年开始使用dotnet core开发项目。公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代理,项目最终上线。但是这远远没达到微服务的要求,其中服务治理,断路器都没有。我个人理解,我们谈微服务实际上更多的是谈服务治理这块东西,至于各个的服务只是微服务中的应用而已。一次偶然的机会发现了java的spring cloud这套框架,而且支持dotnet core集成(Steeltoe OSS)。所以目前我们的项目架构是spring cloud搭建底层微服务框架,dotnet core来编写业务逻辑。
spring cloud
spring cloud是java平台提供的一套解决方案,目前市面上来说可能不是最好的微服务解决方案,但是一定是功能最齐全最全的解决方案。提供了一些微服务的基础功能,包括服务治理、负载均衡、断路器、配置中心、API网关等等。
服务治理
关于服务治理这块东西,网上太多太多的资料和原理。相信大家也看了很多,但是如何应用到实际的项目场景,为什么要这样做呢?传统的项目,服务与服务之间的调用都是通过URL来访问,如果是集群那么通过一个负载均衡地址来访问,增加或者减少机器都是通过维护负载均衡列表的IP地址来实现。微服务架构下,分散成了N个服务,每个服务又是一个集群,对于一个大项目来说,维护这些配置是非常头疼的。笔者曾经在某知名互联网公司工作过,公司最累最背锅的就是运维团队,基本24小时都在应付各个团队的部署上线工作以及各种配置的维护,而且还经常出错挨骂。那么服务治理就出现在这种应用场景之中,运维工程师不用再维护各个负载均衡节点,由服务中心去统一处理。举个简单例子,一个电商网站,分解成N个服务,其中有一个用户服务,有一个订单服务,用户服务需要调用订单服务,而订单服务是一个集群,对于用户中心来说他只需要知道访问订单中心即可,至于具体访问订单中心的哪台机器由服务中心来调配。
搭建服务治理平台
- java开发环境和IDE使用请自行百度,笔者java开发的ide使用的intellij idea。
- 创建一个spring boot项目,项目名称service-center,添加spring cloud的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
- 添加@EnableEurekaServer注解
@EnableEurekaServer
@SpringBootApplication
public class ServiceCenterApplication {}
- 设置应用程序的端口和名称
spring.application.name=service-center
server.port=5000
- 启动项目,在浏览器输入http://localhost:5000/

注册服务
- 使用vs创建一个dotnet core web api程序
- 使用nuget添加Pivotal.Discovery.Client库
<PackageReference Include="Pivotal.Discovery.Client" Version="1.1.0" />
3.Program.cs 设置一个端口
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.UseUrls("http://*:8010")
.Build();
host.Run();
}
- Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDiscoveryClient(Configuration);
// Add framework services.
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseMvc();
app.UseDiscoveryClient();
}
- appsettings.json
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
},
"spring": {
"application": {
"name": "serviceone"
}
},
"eureka": {
"client": {
"serviceUrl": "http://localhost:5000/eureka/",
"shouldFetchRegistry": false,
"shouldRegisterWithEureka": true
},
"instance": {
"port": 8010
}
}
}
如果是团队开发,"shouldRegisterWithEureka"设置成false,防止本地环境注册到开发环境
- 启动程序,再次访问http://localhost:5000/发现已经注册到服务中心了

- 同样的方式我们再创建一个ServiceTwo的项目,修改programe.cs和appsettings.json文件,其它不变
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.UseUrls("http://*:8011")
.Build();
host.Run();
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
},
"spring": {
"application": {
"name": "servicetwo"
}
},
"eureka": {
"client": {
"serviceUrl": "http://loclhost:5000/eureka/",
"shouldFetchRegistry": false,
"shouldRegisterWithEureka": true
},
"instance": {
"port": 8011
}
}
}
- 再次访问http://localhost:5000/,发现ServiceOne和ServiceTwo都已经注册到服务中心了

后记
这样一个简单的服务治理平台就搭建出来了,我们通过spring cloud来创建了一个服务中心,然后通过dotnet core创建了2个服务注册到了服务中心,但是这些离微服务还差的远.服务之间怎么相互调用呢?集群模式怎么处理呢?微服务的统一API网关呢?留下这些问题,且听下回分解。
第二篇文章已经发布。spring cloud+dotnet core搭建微服务架构:服务发现(二)
示例代码
所有代码均上传github。代码按照章节的顺序上传,例如第一章demo1,第二章demo2以此类推。
求推荐,你们的支持是我写作最大的动力,我的QQ群:328438252,交流微服务。
传送门
- spring cloud+dotnet core搭建微服务架构:服务注册(一)
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
- spring cloud+dotnet core搭建微服务架构: Api网关(三)
- spring cloud+dotnet core搭建微服务架构:配置中心(四)
参考资料
java部分
.net部分
手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)的更多相关文章
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...
- spring cloud+dotnet core搭建微服务架构:Api网关(三)
前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...
- spring cloud+dotnet core搭建微服务架构:配置中心(四)
前言 我们项目中有很多需要配置的地方,最常见的就是各种服务URL地址,这些地址针对不同的运行环境还不一样,不管和打包还是部署都麻烦,需要非常的小心.一般配置都是存储到配置文件里面,不管多小的配置变动, ...
- spring cloud+dotnet core搭建微服务架构:配置中心续(五)
前言 上一章最后讲了,更新配置以后需要重启客户端才能生效,这在实际的场景中是不可取的.由于目前Steeltoe配置的重载只能由客户端发起,没有实现处理程序侦听服务器更改事件,所以还没办法实现彻底实现这 ...
- spring cloud+dotnet core搭建微服务架构:Api授权认证(六)
前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...
- spring cloud+.net core搭建微服务架构:服务注册(一)
背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...
- spring cloud+.net core搭建微服务架构:Api授权认证(六)
前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...
- spring cloud+.net core搭建微服务架构:配置中心续(五)
前言 上一章最后讲了,更新配置以后需要重启客户端才能生效,这在实际的场景中是不可取的.由于目前Steeltoe配置的重载只能由客户端发起,没有实现处理程序侦听服务器更改事件,所以还没办法实现彻底实现这 ...
- spring cloud+.net core搭建微服务架构:配置中心(四)
前言 我们项目中有很多需要配置的地方,最常见的就是各种服务URL地址,这些地址针对不同的运行环境还不一样,不管和打包还是部署都麻烦,需要非常的小心.一般配置都是存储到配置文件里面,不管多小的配置变动, ...
随机推荐
- 一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”)
该篇为“啰里啰嗦版”,另有相应的“精简版”供参考 “不到长城非好汉:不做OS,枉为程序员” OS之于程序员,如同梵蒂冈之于天主教徒,那永远都是块神圣的领土.若今生不能亲历之,实乃憾事! 但是,圣域不是 ...
- 再起航,我的学习笔记之JavaScript设计模式12(适配器模式)
适配器模式 适配器模式(Adapter): 将一个类(对象)的接口(方法或属性)转化成为另外一个接口,使类(对象)之间接口的不兼容问题通过适配器得以解决. 适配相似的框架 不知道大家有没有遇到过这种场 ...
- centos7使用无线wifi连接
一:所用命令 dmesg | grep firmware(看看有没有来自无线网卡的固件请求) iw: iw dev(查找无线网卡口) iw wls1 link(查看wls1网口无线网络连接情况) iw ...
- C# 使用NPOI 实现Excel的简单导入导出
private void btnImport_Click(object sender, EventArgs e) { DataSet ds = new DataSet(); DataTable dt ...
- Dapper获取连接类
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- vue引入百度地图api组件封装(根据地址定位)
Map.vue <template> <div class="Map" :style="{ height: this.height+'px', widt ...
- memcached常用命令
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt104 一.Memcache面向对象的常用接口包括:Memcache::con ...
- 数据库学习任务二:数据库连接对象SqlConnection
数据库应用程序的开发流程一般主要分为以下几个步骤: 创建数据库 使用Connection对象连接数据库 使用Command对象对数据源执行SQL命令并返回数据 使用DataReader和DataSet ...
- css样式实现立方体制作
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 团队作业八——第二次团队冲刺(Beta版本)第4天
团队作业八--第二次团队冲刺(Beta版本)第4天 一.每个人的工作 (1) 昨天已完成的工作 做一下用户注册的功能和登录功能. (2) 今天计划完成的工作 完成界面跳转 (3) 工作中遇到的困难 界 ...