1.前言

hi,大家好,我是三合,距离上一篇博客已经过去了整整两年,这两年里,博主通关了《人生》这个游戏里的两大关卡,买房和结婚。最近闲了下来,那么当然要继续写博客了,今天这篇博客的主要内容是,net core/.net6中,如何利用SummerBoot(点我打开详情介绍)中的feign模块快速接入微服务中心nacos(点我打开详情介绍),接下来我会从微服务的概念到feign的使用方法,由浅入深的进行介绍。

2.服务与实例

服务与实例的关系,可以类比为程序员与你我的关系,程序员是服务,我们是实例,比如老板要实现一个功能,那么他一般会说,交给程序员开发,而不是说交给张三开发,万一张三离职了,他还要问还有谁是程序员,然后才能说找谁开发,太麻烦了,毕竟老板的重点是找人开发出来,而不是具体找哪个人,直接说交给程序员开发,那么无论公司里哪个程序员离职或者入职,只要程序员群体有人就行,服务在这里就起到了一个统一入口,屏蔽底层细节,减少沟通成本的作用。拉回正题,当我们的系统对外提供了api接口给其他系统调用的时候,我们就可以说这个系统对外提供了服务,当然,为了高可用性,我们一般会部署多个站点进行负载均衡,免得一个站点挂了,整个系统就挂了,在微服务中,我们一般称呼这一个个站点为一个个服务实例,服务与实例一般是一对多的关系。

3.nacos的安装

安装具体参考nacos官网,博主这里推荐使用docker的方式安装,简单又快速,免得大家迈出微服务第一步的时候就出师未捷身先死。

4.安装SummerBoot

在nuget中搜索Summerboot,安装即可,SummerBoot支持net core 3.1和.net 6。

5. 服务实例注册与服务调用

我们平时调用其他的系统的接口,一般都需要,ip(域名)+port+具体接口,但在nacos中,则可以简化为,服务名+具体接口,nacos中,服务是一等公民,我们调用的都是服务,至于哪些服务实例联合一起提供了这些服务,则不是我们关心的内容,换言之,nacos中,服务帮我们屏蔽了一个个站点的细节,我们不用去关心要调用的接口的ip地址和端口号。使用nacos服务中心,分为两步,服务实例注册和服务调用。

5.1 服务实例注册

我们以程序员的身份入职公司,这一步就是服务实例注册,这样我们就成为我们公司程序员群体中的一员了。拉回正题,服务实例注册就是将我们的应用注册为服务的一个实例,由服务作为对外统一入口,为其他系统提供接口服务,以供他们调用。这里提一下nacos检测实例是否存活的心跳机制就是实例每5秒钟向nacos注册中心发送一个心跳包,确认存活状态。那么在feign中是如何注册服务实例的呢,非常简单,只需要两步

5.1.1 在配置文件appsettings.json/appsettings.Development.json中添加nacos的配置信息

"nacos": {
//nacos服务地址,如http://172.16.189.242:8848
"serviceAddress": "http://172.16.189.242:8848/",
//是否要把应用注册为服务实例
"registerInstance": true,
//命名空间id,如832e754e-e845-47db-8acc-46ae3819b638或者public
"namespaceId": "dfd8de72-e5ec-4595-91d4-49382f500edf",
//要注册的服务名
"serviceName": "test",
//服务的分组名
"groupName": "DEFAULT_GROUP",
//权重,一个服务下有多个实例,权重越高,访问到该实例的概率越大,比如有些实例所在的服务器配置高,那么权重就可以大一些,多引流到该实例,与上面的参数lbStrategy设置为WeightRandom搭配使用
"weight": 1,
//本应用对外的网络协议,http或https
"protocol": "http",
//本应用对外的端口号,比如5000
"port": 5000
}

每一个配置参数我都添加了详细的说明,大家注意这里,我们把应用对外的端口号和协议都配置了,为什么没配置ip呢,因为ip可以自动获取,就免得大家配置了,这里weight(即权重)参数是什么意思呢,我们平时部署应用的服务器的配置有的高,有的低,比如两台服务器,A和B,A是4c8g,B是128c256g,那么明显B服务器配置更高,我们就应该把更多的请求分配给B服务器去处理,毕竟能者多劳嘛,那么我们在A和B服务器上部署应用,配置weight参数时,A服务器上的应用应当配置为1,B配置为32,代表1台B服务器相当于32台A服务器,这些配置信息会作为元信息上传到nacos中心,这样我们在服务调用的时候才会知道,该用怎么样的方式,什么ip什么端口去请求哪个实例上的接口。

5.1.2 在StartUp.cs中添加配置

services.AddSummerBoot();
services.AddSummerBootFeign(it =>
{
it.AddNacos(Configuration);
});

仅需这两步,我们就完成了服务实例注册,运行web程序,然后大家打开nacos的面板,就可以看到我们注册的服务,点开服务,也可以看到服务下面的实例,至此,我们的服务就可以对外提供服务了。同时启动多个应用就意味着注册了多个服务实例,注意要配置好相应的端口号。

5.2 服务调用

老板说把某个需求交给程序员实现,这就是服务调用。那么我们如何调用别的微服务系统所提供的服务呢?在feign中,这也是非常简单的,因为feign本身是一个声明式http客户端,我们只需要定义接口,实现类会由SummerBoot框架自动生成,我们在要用到的地方注入接口即可直接调用。feign服务调用分为三步。

5.2.1 在配置文件appsettings.json/appsettings.Development.json中添加nacos的配置信息

"nacos": {
//nacos服务地址,如http://172.16.189.242:8848
"serviceAddress": "http://172.16.189.242:8848/",
//客户端负载均衡算法,一个服务下有多个实例,lbStrategy用来挑选服务下的实例,默认为Random(随机),也可以选择WeightRandom(根据服务权重加权后再随机)
"lbStrategy": "Random",
}

大家应该可以看到,相比于服务实例注册,我们要调用别的微服务系统所提供的服务,要配置的参数要少的多,只有2个,nacos服务地址和客户端负载均衡算法,我这里要解释一下什么叫客户端负载均衡算法,我们将多个应用注册为服务实例后,当我们要调用这个服务时,feign会先请求nacos的接口,获取这个服务下所有的健康且存活的实例,那么理论上我们请求这些实例中的任何一个都是可以的,那么如何挑选实例呢,这里就涉及到一个客户端负载均衡算法,避免服务器分配到的流量旱的旱死,涝的涝死。feign在这里总共实现了2种算法,1.Random算法,即随机从实例列表中挑选出一个实例去发起请求,根据统计学,当请求量够大的时候,命中每个实例的概率是相同的,所以随机算法也可以称为平均算法。2.WeightRandom算法,即根据服务实例权重加权后再随机,此时要联系上面对weight参数的讲解,A服务器上的应用的权重是1,B服务器上的应用的权重是32,那么如果根据random算法,分配给A和B的流量都是50%,这明显不合理,所以我们根据权重加权后再随机,1+32=33,那么此时命中A的概率为1/33,命中B的概率为32/33,这样就合理多了。

5.2.2 在StartUp.cs中添加配置

services.AddSummerBoot();
services.AddSummerBootFeign(it =>
{
it.AddNacos(Configuration);
});

5.2.3 定义调用微服务的接口

普通的feign接口像下面这样定义即可。注意,如果返回值是类的话,该类需要具有无参构造函数,否则会反序列化失败。

[FeignClient(Url = "http://localhost:5001/home")]
public interface ITestFeign
{
[PostMapping("/form")]
Task<Test> TestForm([Body(BodySerializationKind.Form)] Test tt); [GetMapping("/query")]
Task<Test> TestQuery([Query] Test tt); [PostMapping("/json")]
Task<Test> TestJson([Body(BodySerializationKind.Json)] Test tt);
}

微服务的接口定义就要复杂一些,需要设置微服务的名称ServiceName,分组名称NacosGroupName(不填则默认DEFAULT_GROUP),命名空间NacosNamespaceId(不填则默认public),以及MicroServiceMode设为true即可。url不用配置,剩下的就和正常的feign接口一样。

[FeignClient( ServiceName = "test", MicroServiceMode = true,NacosGroupName = "DEFAULT_GROUP", NacosNamespaceId = "dfd8de72-e5ec-4595-91d4-49382f500edf")]
public interface IFeignService
{
[GetMapping("/home/index")]
Task<string> TestGet();
}

同时ServiceName,NacosGroupName,NacosNamespaceId也支持从配置文件中读取,配置项用${}包裹即可,如配置文件中配置为

{
"ServiceName": "test",
"NacosGroupName": "DEFAULT_GROUP",
"NacosNamespaceId": "dfd8de72-e5ec-4595-91d4-49382f500edf"
}

接口定义为

[FeignClient( ServiceName = "${ServiceName}", MicroServiceMode = true,NacosGroupName = "${NacosGroupName}", NacosNamespaceId = "${NacosNamespaceId}")]
public interface IFeignService
{
[GetMapping("/home/index")]
Task<string> TestGet();
}

定义完接口,就可以在要用到的地方注入,然后直接调用了,是不是觉得很简单。

6.结尾

更多feign的用法,可参考SummerBoot文档,也可以加入QQ群:799648362反馈建议。同时,如果你觉得这篇文章还不错的话,请记得一键三连(推荐+关注+github star)

net core天马行空系列-微服务篇:全声明式http客户端feign快速接入微服务中心nacos的更多相关文章

  1. Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务

    首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...

  2. spring cloud 声明式rest客户端feign调用远程http服务

    在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.Feign就是Spring Cloud提供的一种声明式R ...

  3. .Net Core微服务入门全纪录(八)——Docker Compose与容器网络

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(七)--IdentityServer4-授权认证]中使用IdentityServer4 ...

  4. .Net Core微服务入门全纪录(完结)——Ocelot与Swagger

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(八)--Docker Compose与容器网络]完成了docker-compose.y ...

  5. net core天马行空系列: 一个接口多个实现类,利用mixin技术通过自定义服务名,实现精准属性注入

    系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 2.net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作 哈哈哈哈,大家好,我 ...

  6. net core天马行空系列:移植Feign,结合Polly,实现回退,熔断,重试,超时,做最好用的声明式http服务调用端

    系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 2.net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作 3.net core ...

  7. .Net Core微服务入门全纪录(一)——项目搭建

    前言 写这篇博客主要目的是记录一下自己的学习过程,只能是简单入门级别的,因为水平有限就写到哪算哪吧,写的不对之处欢迎指正. 什么是微服务? 关于微服务的概念解释网上有很多... 个人理解,微服务是一种 ...

  8. .Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)

    前言 上一篇[.Net Core微服务入门全纪录(一)--项目搭建]讲到要做到服务的灵活伸缩,那么需要有一种机制来实现它,这个机制就是服务注册与发现.当然这也并不是必要的,如果你的服务实例很少,并且很 ...

  9. .Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)

    前言 上一篇[.Net Core微服务入门全纪录(二)--Consul-服务注册与发现(上)]已经成功将我们的服务注册到Consul中,接下来就该客户端通过Consul去做服务发现了. 服务发现 同样 ...

随机推荐

  1. Android项目如何打包成安装包.apk

    1.Build -> Generate Signed APK 2.APK -> Next 3.输入Key store path以及密码 ->next(如果是第一次则需要新建,新建教程 ...

  2. JavaScript实现科学计算器

    运行效果: 可实现科学计算器的功能,如:PI,sin,cos,tan等 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> ...

  3. 小程序滚动事件之头部渐隐渐现demo

    效果图: ==>  代码: //test1.wxml <view class='header' style="opacity:{{opacityStyle}}" hid ...

  4. 在ios里面返回上一级报错问题

    $("#backPrev").attr("href","javascript:void(0);").click(function(){    ...

  5. java-GUI编程之AWT组件

    AWT中常用组件 基本组件 组件名 功能 Button Button Canvas 用于绘图的画布 Checkbox 复选框组件(也可当做单选框组件使用) CheckboxGroup 用于将多个Che ...

  6. 基于Apache组件,分析对象池原理

    池塘里养:Object: 一.设计与原理 1.基础案例 首先看一个基于common-pool2对象池组件的应用案例,主要有工厂类.对象池.对象三个核心角色,以及池化对象的使用流程: import or ...

  7. spring-aop相关概念

    如果下面有疑问请看完动态代理技术的分析 Aop术语: Target(目标对象):要被增强的方法的对象 Proxy(代理对象):简单的说就是对目标对象进行增强的代理类 Joinpoint(连接点):可以 ...

  8. 使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题

    理想的代码优化方式 团队日常协作中,自然而然的会出现很多重复代码,根据这些代码的种类,之前可能会以以下方式处理 方式 描述 应用时可能产生的问题 硬编码 多数新手,或逐渐腐坏的项目会这么干,会直接复制 ...

  9. JavaScript学习总结9

    今天学习了表单提交,JQuery部分知识

  10. 关于 display: inline-block; 中间有间隙的问题

    当我们给一个元素的一系列子元素设置display: inline-block; 时,会发现子元素之间存在间隙,如 <style> div { display: inline-block; ...