- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章.netcore 使用surging框架发布到docker由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
demo运行在windows的docker中,系统是win10,所以需要先下载docker for windows,安装完毕后系统会重启,然后桌面上可以找到docker for windows的快捷图标,右下角有个鲸鱼小图标 。
单击右键,选择菜单中的kitematic 。
会提示你下载kitematic,自行下载后解压即可,将kitematic快捷到桌面; 。
打开kitematic,在搜索栏中下载好rabbitmq、redis、consul相关镜像,因为这些是surging运行的先决条件.
接着去github上下载surging网关项目,修改其中的gatewaysettings.json中register下的address地址,对应的事consul docker镜像的ip 。
具体如何查看其ip,看如下操作:
打开kitematic,点击左下角,如图:
进入到命令窗口,输入docker container ls或者 docker ps -a 查看docker, 。
可以看到现在运行的docker的相关信息, 。
如图:
然后查看consul的相关配置,输入docker inspect 镜像的 containerid,如consul的id是b0e98b94638c,输入命令如下:docker inspect b0e98b94638c, 。
显示这个docker的配置,内容会很多,不过ip的信息在最后,如图 。
找到其中的ip是多少,然后修改surging网关中的consul地址为:"address": "172.17.0.4:8500",其他配置根据上面的操作进行修改,如redis 镜像地址的查找和修改等; 。
修改好surging的网关配置后在surging.apigateway项目上单击右键,由于我项目中已经添加过,所以该处为灰色,如图:
新建docker-compose后修改其中docker-compose.yml的配置如下:
在后面添加docker的外部端口和内部端口的映射和网络模式,这里我们都使用桥接模式,包括之前的consul、rabbitmq、redis都是同一模式,这样他们会在同一vlan下, 。
然后运行网关,如下:
接下来新建一个解决方案,方案名随意,喜欢就好,由于时间比较短,这里我简单的处理,不清楚的可以留言 。
新建service.a,然后在其下新建控制台应用service.a、service.b、service.c,新建类库service.a.service、service.b.service、service.c.service; 。
编辑service.a.csporj、service.b.csporj、service.c.csporj,如下 。
将其中的引用包都复制过去,分别修改一下对应的service,即其中的<projectreference include="..\service.a.service\service.a.service.csproj" />,service.a引用service.a.service,service.b引用service.b.service 。
service.c引用service.c.service,
类库service.a.service、service.b.service、service.c.service中都引用 。
<packagereference include="surging" version="0.5.4" /> 。
如图:
由于代码很多地方相识,以下我只说service.a,和service.a.service; 。
service.a 中新增configs文件夹,下面添加log4net.config,log4net.config代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
<
log4net
>
<
root
>
<
level
value
=
"error"
/>
<!-- <appender-ref ref="rollinglogfileappender" /> -->
<
appender-ref
ref
=
"errorrollinglogfileappender"
/>
</
root
>
<
appender
name
=
"errorrollinglogfileappender"
type
=
"log4net.appender.rollingfileappender,log4net"
level
=
"error"
>
<
lockingmodel
type
=
"log4net.appender.fileappender+minimallock"
/>
<
param
name
=
"file"
value
=
"c:\surging\error\"
/>
<
param
name
=
"appendtofile"
value
=
"true"
/>
<
param
name
=
"rollingstyle"
value
=
"composite"
/>
<
param
name
=
"datepattern"
value
=
"_yyyymmddhh.txt"
/>
<
param
name
=
"staticlogfilename"
value
=
"false"
/>
<
param
name
=
"maxsizerollbackups"
value
=
"-1"
/>
<
param
name
=
"maximumfilesize"
value
=
"5mb"
/>
<
layout
type
=
"log4net.layout.patternlayout,log4net"
>
<
param
name
=
"conversionpattern"
value
=
"%date [%thread] %-5level %logger [%ndc] - %message%newline"
/>
</
layout
>
<
filter
type
=
"log4net.filter.levelrangefilter"
>
<
param
name
=
"levelmin"
value
=
"error"
/>
<
param
name
=
"levelmax"
value
=
"fatal"
/>
</
filter
>
</
appender
>
</
log4net
>
|
然后新增cachesettings.json其中map:properties下的value的值是redis地址 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
{
"cachingsettings"
: [
{
"id"
:
"ddlcache"
,
"class"
:
"surging.core.caching.rediscache.rediscontext,surging.core.caching"
,
"properties"
: [
{
"name"
:
"apprulefile"
,
"ref"
:
"rule"
},
{
"name"
:
"datacontextpool"
,
"ref"
:
"ddls_sample"
,
"maps"
: [
{
"name"
:
"redis"
,
"properties"
: [
{
"value"
:
"172.17.0.2:6379::1"
}
]
},
{
"name"
:
"memorycache"
}
]
},
{
"name"
:
"defaultexpiretime"
,
"value"
:
"120"
},
{
"name"
:
"connecttimeout"
,
"value"
:
"120"
},
{
"name"
:
"minsize"
,
"value"
:
"1"
},
{
"name"
:
"maxsize"
,
"value"
:
"10"
}
]
}
]
}
|
新增eventbussettings.json,其中的eventbusconnection对应的是rabbitmq docker的地址 。
1
2
3
4
5
|
{
"eventbusconnection"
:
"172.17.0.3"
,
"eventbususername"
:
"guest"
,
"eventbuspassword"
:
"guest"
}
|
program.cs的代码如下 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
using
autofac;
using
surging.core.codec.messagepack;
using
surging.core.consul;
using
surging.core.consul.configurations;
using
surging.core.cplatform;
using
surging.core.cplatform.utilities;
using
surging.core.dotnetty;
using
surging.core.eventbusrabbitmq;
using
surging.core.log4net;
using
surging.core.proxygenerator;
using
surging.core.servicehosting;
using
surging.core.servicehosting.
internal
.implementation;
using
system;
using
system.text;
namespace
service.a
{
class
program
{
static
void
main(
string
[] args)
{
newmethod();
}
private
static
void
newmethod()
{
encoding.registerprovider(codepagesencodingprovider.instance);
var host =
new
servicehostbuilder()
.registerservices(builder =>
{
builder.addmicroservice(option =>
{
option.addserviceruntime();
option.addrelateservice();
//option.usezookeepermanager(new configinfo("127.0.0.1:2181"));
option.useconsulmanager(
new
configinfo(
"172.17.0.4:8500"
));
option.usedotnettytransport();
option.userabbitmqtransport();
option.addrabbitmqadapt();
//option.useprotobuffercodec();
option.usemessagepackcodec();
builder.register(p =>
new
cplatformcontainer(servicelocator.current));
});
})
.subscribeat()
.uselog4net(
"configs/log4net.config"
)
//.useserver("127.0.0.1", 98)
//.useserver("127.0.0.1", 98,“true”) //自动生成token
//.useserver("127.0.0.1", 98,“123456789”) //固定密码token
.useserver(options =>
{
options.ip =
"172.17.0.6"
;
options.port = 9990;
options.token =
"true"
;
options.executiontimeoutinmilliseconds = 30000;
options.maxconcurrentrequests = 200;
options.notrelatedassemblyfiles =
"centa.agency.application.dto\\w*|stackexchange.redis\\w*"
;
})
.useproxy()
.usestartup<startup>()
.build();
using
(host.run())
{
console.writeline($
"服务端启动成功,{datetime.now}。"
);
}
}
}
}
|
新增startup.cs 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
using
autofac;
using
autofac.extensions.dependencyinjection;
using
microsoft.extensions.configuration;
using
microsoft.extensions.dependencyinjection;
using
microsoft.extensions.logging;
using
surging.core.caching.configurations;
using
surging.core.cplatform.utilities;
using
surging.core.eventbusrabbitmq.configurations;
using
system;
namespace
service.a
{
public
class
startup
{
public
startup()
{
var config =
new
configurationbuilder()
.setbasepath(appcontext.basedirectory);
configureeventbus(config);
//configurecache(config);
}
public
icontainer configureservices(containerbuilder builder)
{
var services =
new
servicecollection();
configurelogging(services);
builder.populate(services);
servicelocator.current = builder.build();
return
servicelocator.current;
}
public
void
configure(icontainer app)
{
app.resolve<iloggerfactory>()
.addconsole((c, l) => (
int
)l >= 3);
}
#region 私有方法
/// <summary>
/// 配置日志服务
/// </summary>
/// <param name="services"></param>
private
void
configurelogging(iservicecollection services)
{
services.addlogging();
}
private
static
void
configureeventbus(iconfigurationbuilder build)
{
build
.addeventbusfile(
"eventbussettings.json"
, optional:
false
);
}
/// <summary>
/// 配置缓存服务
/// </summary>
private
void
configurecache(iconfigurationbuilder build)
{
build
.addcachefile(
"cachesettings.json"
, optional:
false
);
}
#endregion
}
}
|
service.a.service 类库下新增aservice.cs 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
using
surging.core.proxygenerator;
using
system;
using
system.collections.generic;
using
system.text;
using
system.threading.tasks;
namespace
service.a.service
{
public
class
aservice:proxyservicebase,iaservice
{
public
task<
string
> sayhello(
string
name)
{
return
task.fromresult($
"{name} say : hello"
);
}
}
}
|
新增iaservice.cs 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
using
surging.core.cplatform.ioc;
using
surging.core.cplatform.runtime.server.implementation.servicediscovery.attributes;
using
system;
using
system.collections.generic;
using
system.text;
using
system.threading.tasks;
namespace
service.a.service
{
[servicebundle(
"api/{service}"
)]
public
interface
iaservice : iservicekey
{
task<
string
> sayhello(
string
name);
}
}
|
其他类库和服务与以上代码基本无二,这里不在赘述。不清楚的可以留言 。
所有代码都处理好后,在service.a、service.b、service.c项目上右键新增docker支持文件,然后会生成一下文件 。
修改其中的docker-compose.yml 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
version: '3'
services:
service.a:
image: servicea
ports:
- "127.0.0.1:9990:9990"
network_mode: "bridge"
build:
context: .
dockerfile: service.a/dockerfile
service.b:
image: serviceb
ports:
- "127.0.0.1:9991:9991"
network_mode: "bridge"
build:
context: .
dockerfile: service.b/dockerfile
service.c:
image: servicec
ports:
- "127.0.0.1:9992:9992"
network_mode: "bridge"
build:
context: .
dockerfile: service.c/dockerfile
webapplication1:
image: webapplication1
build:
context: .
dockerfile: ../webapplication1/dockerfile
|
然后选择docker运行即可 。
最后访问surging网关,即可看见效果 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://www.cnblogs.com/landonzeng/p/8612026.html 。
最后此篇关于.netcore 使用surging框架发布到docker的文章就讲到这里了,如果你想了解更多关于.netcore 使用surging框架发布到docker的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在一个新的 ASP.NET Core RC2 类库中,我有以下 project.json 文件,我试图在其中遵循 How to trim your package dependencies 上的文档.
我在本地提要上将 nuget 包从 2.2.x 更新到 3.1.0。 然后,在构建机器上尝试构建项目,但是: Project.csproj(0,0): Error NU1102: Unable to
快递100的物流信息查询接口,官方提供了一些demo;还好官方提供的代码是.netcore版本写的,不过写的有点low;根据官方提供的代码,我按照.netcore 的风格重构了代码;核心代码如下:
1、docker介绍 docker是用go语言编写基于linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖。相较于虚
demo运行在windows的docker中,系统是win10,所以需要先下载docker for windows,安装完毕后系统会重启,然后桌面上可以找到docker for windows的快捷
NetCore WebSocket 即时通讯示例,供大家参考,具体内容如下 1.新建Netcore Web项目 2.创建简易通讯协议 ?
需求场景: 我需要部署的项目是在Windows上开发的,目标框架为.net core 6.0 因此我们需要先在kylin上部署项目运行所需要的环境。 借助百
我正在 .NET Core 中重写一个调用外部 Web 服务的控制台应用程序。 我目前收到以下错误: One or more errors occurred. (The HTTP request is
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我有一组库,我想将其从 PCL 转移到 netcore。通过此举,我想简化 DI 系统并更新一些内部工作方式。 我想添加的其中一件事是内部对象的配置,就像在 Asp.Net Core 中一样(即 se
注:本文隶属于《理解ASP.NET Core》系列文章,请查看置顶博客或 点击此处查看全文目录 概述 在微服务化的架构设计中,网关扮演着重要的看门人角色,它所提供的功能之一
对于有多个应用系统的企业来说,每一个应用系统都有自己的用户体系,这就造成用户在切换不同应用系统时,就要多次输入账号密码,导致体验非常不好,也造成使用上非常不便。 针对这个问题,我们就可以采用单
就像 Web Api 接口可以对入参进行验证,避免用户传入非法的或者不符合我们预期的参数一样,选项也可以对配置源的内容进行验证,避免配置中的值与选项类中的属性不对应或者不满足预期,毕竟大部分配置
.NET Core 选项系统的主要实现在 Microsoft.Extensions.Options 和 Microsoft.Extensions.Options.ConfigurationExten
漏洞说明: 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击
分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护。 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时。
一个应用要运行起来,往往需要读取很多的预设好的配置信息,根据约定好的信息或方式执行一定的行为。 配置的本质就是软件运行的参数,在一个软件实现中需要的参数非常多,如果我们以 Hard Code(
2. 配置添加 配置系统可以读取到配置文件中的信息,那必然有某个地方可以将配置文件添加到配置系统中。之前的文章中讲到 ASP.NET Core 入口文件中,builder(WebApplica
3. 配置提供程序 上面提到,通过 IConfigurationBuilder 的实现类对象,我们可以自由地往配置系统中添加不同的配置提供程序,从而获取不同来源的配置信息。.NET Core
4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvide
我是一名优秀的程序员,十分优秀!