nacos实现Java和.NetCore的服务注册和调用
用nacos作为服务注册中心,如何注册.NetCore服务,如何在Java中调用.NetCore服务呢?可以分为下面几个步骤:
0.运行nacos
1.开发.net core服务,然后调用nacos提供的.net core sdk注册服务。
2.开发Java服务,然后注册服务。
3.用RestTemplate调用.net core服务。
4.用OpenFeign调用服务
下面来看具体步骤:
0.参考我之前的文章分布式配置nacos搭建踩坑指南(下) ,首先运行nacos.
1.首先开发一个.net core web api,我们返回的数据是天气预报消息,新建一个WeatherForecastController,代码如下:
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebApi.Controllers {[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"}; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger){_logger = logger;} [HttpGet]public IEnumerable<WeatherForecast> Get(){var rng = new Random();return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();}//public String Get()//{// return "sunny";//} } }
然后设置好访问的url,在launchSettings.json的修改 "applicationUrl": "http://192.168.1.110:5000",注意这里去掉了https://192.168.1.110:5001,是为了避免在后面Java调用时需要证书的麻烦。
最后我们在cmd中输入dotnet run,当服务正常运行起来后,在浏览器中输入:http://192.168.1.110:5000/weatherforecast,发现成功返回天气数据,格式为json,截图如下:
2.net core项目中引入nuget包:nacos-sdk-csharp,截图如下:
3.调用nacos-sdk-csharp,进行服务注册,代码如下:
using System; using Microsoft.Extensions.DependencyInjection; using Nacos.V2; using Nacos.V2.DependencyInjection; using System.Collections.Generic; using System.Threading.Tasks; namespace NacosDiscoveryProviderNetCoreTest1 {class Program{static async Task Main(string[] args){string serverAddr = "http://localhost:8848";string dataId = "config2";string group = "DEFAULT_GROUP"; IServiceCollection services = new ServiceCollection();//register service services.AddNacosV2Naming(x =>{x.ServerAddresses = new List<string>() { serverAddr };//x.ConfigUseRpc = true; });IServiceProvider serviceProvider = services.BuildServiceProvider();var namingSvc = serviceProvider.GetService<INacosNamingService>();await namingSvc.RegisterInstance("weatherforecast", "192.168.1.110", 5000);Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(await namingSvc.GetAllInstances("weatherforecast")));Console.ReadKey(); }} }
我们进入nacos后台,如果服务注册成功,我们就会在服务列表中看到weatherforecast服务了,如下所示:
有两个地方必须切记注意:
1).namingSvc.RegisterInstance("weatherforecast", "192.168.1.110", 5000);是一句很关键的代码,意思是注册一个名为weatherforecast,地址为:192.168.1.110,端口为:5000的服务。
2)launchSettings.json里的applicationUrl必须去掉包含https的设置,只保留http的设置,即只保留:"applicationUrl": "http://192.168.1.110:5000",否则在Java中调用会报证书错误。
4.参考nacos服务注册,利用阿里巴巴Spring boot脚手架,引入:spring-boot-starter-web,spring-cloud-starter-alibaba-nacos-discovery,spring-cloud-starter,spring-boot-starter-test,spring-cloud-starter-loadbalancer,spring-cloud-starter-openfeign。完整的pom如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.11</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.alibaba.cloud</groupId><artifactId>nocos-discovery-consumer-sample</artifactId><version>0.0.1-SNAPSHOT</version><name>nocos-discovery-consumer-sample</name><description>Demo project for Spring Boot</description> <properties><java.version>1.8</java.version><spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version><spring-cloud.version>2021.0.4</spring-cloud.version></properties> <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter</artifactId></dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId><version>3.0.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version> </dependency> <dependency> <groupId>org.netbeans.external</groupId> <artifactId>org-apache-commons-httpclient</artifactId> <version>RELEASE126</version> </dependency> </dependencies> <dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement> <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project>
5.application.properties的设置同前面的文章里介绍的设置一样,代码如下所示:
spring.application.name=nocos-discovery-consumer-sample spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.cloud.nacos.discovery.namespace=public spring.main.allow-circular-references=true server.port=9091
6.新建一个名为WeatherService的接口,代码如下:
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; @FeignClient("weatherforecast") @LoadBalancerClient("weatherforecast") public interface WeatherService { @GetMapping("/Weatherforecast")public String getWeather();}
7.新建一个RestTemplateController,代码如下:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import com.alibaba.fastjson.JSONObject; import org.springframework.context.annotation.Bean; import org.apache.commons.httpclient.methods.GetMethod; //import org.apache.http.client.HttpClient; import org.apache.commons.httpclient.HttpClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import java.io.*; @RestController public class RestTemplateController { //@LoadBalanced@Autowiredpublic RestTemplate resttemplate;//@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}@Autowiredprivate EchoService echoService;@Autowiredprivate WeatherService weatherService;@Autowired DiscoveryClient discoveryClient;//resttemplate test@GetMapping("/call/echo") public String callEcho() { System.out.println("callEcho");ServiceInstance serviceInstance=discoveryClient.getInstances("weatherforecast").get(0);System.out.println("Host is: "+serviceInstance.getHost()+" ,port is: "+serviceInstance.getPort());String urlString=serviceInstance.getHost()+":"+serviceInstance.getPort()+"/weatherforecast"; urlString="http://"+urlString; //RestTemplate testreturn resttemplate.getForObject(urlString, String.class);}//openFeign test@GetMapping("/getWeather")public String getWeather() {return weatherService.getWeather(); } }
其中要注意的几点:
1) ServiceInstanceserviceInstance=discoveryClient.getInstances("weatherforecast").get(0);是一句关键的代码,用于获取weatherforecast服务的实例。
2)callEcho()是调用RestTemplage访问netcore服务
3)getWeather是调用openFeiign访问netcore服务
8.启动类代码如下:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class NocosDiscoveryConsumerSampleApplication { public static void main(String[] args) {SpringApplication.run(NocosDiscoveryConsumerSampleApplication.class, args);} }
9.运行,访问http://192.168.1.110:5000/weatherforecast和http://localhost:9091/getWeather:
nacos实现Java和.NetCore的服务注册和调用相关推荐
- 【Zookeeper】JAVA通过ZK实现服务注册和服务发现
无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程. 服务化现在已经是个很成熟的概念 ...
- spring cloud eureka服务注册和调用
SPRING INITIALIZR构建工程 spring boot 可通过SPRING INITIALIZR构建项目 访问SPRING INITIALIZR官网,填写项目相关信息后,生成项目. 将下载 ...
- 【微服务】微服务注册与调用----Eureka
Eureka 前言 Eureka简介 Eureka Server Eureka Client Eureka优势 Eureka Server单点模式 创建Eureka Server 创建Spring B ...
- Java学习四阶段-07 服务注册中心Nacos
Nacos注册中心简介 背景分析 在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系 ...
- Spring Cloud微服务之Nacos服务注册(九)
Nacos服务注册 前言 具体步骤 1.在service模块配置pom.xml 2.添加服务配置信息 3.添加Nacos客户端注解 4.启动客户端微服务 最后 前言 上一篇中我们介绍完了Nacos的基 ...
- SpringCloud学习之(十八)SpringCloud Alibaba Nacos服务注册和配置中心
文章目录 (十八)SpringCloud Alibaba Nacos服务注册和配置中心 1.Nacos简介 1.1 为什么叫Nacos 1.2 Nacos是什么 1.3 Nacos能干嘛 1.4 Na ...
- 服务注册中心Nacos
文章目录 一.服务注册中心Nacos最佳实践 1.Nacos注册中心简介 背景分析 Nacos概述 构建Nacos服务 初始化配置 服务启动与访问 2.服务注册与调用入门(重点) 业务描述 生产者服务 ...
- Nacos服务注册与发现源码剖析
文章目录 前提介绍 Nacos源码下载 Nacos客户端源码 Spring Cloud Starter Nacos 源码 Nacos服务端源码 前提介绍 服务注册与发现作用主要是为了更好的管理众多的服 ...
- Nacos服务注册中心(微服务)
为什么要用服务注册中心? 在微服务中,首先需要面对的问题就是如何查找服务(软件即服务), 其次就是如何在不同的服务之间进行通信? 如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带 ...
最新文章
- 深入探讨Python的import机制:实现远程导入模块 | CSDN博文精选
- Redis AOF 持久化详解
- 慕课网_《微信授权登录》学习总结
- 算法------------完全平方数(Java版本)
- 【NET CORE微服务一条龙应用】开始篇与目录
- 恶补sql知识(一)
- 三星Galaxy Fold中国区发布会临时取消:推迟时间未定 彻查屏幕问题
- SSM框架搭建过程----学生学籍管理系统
- 【报告分享】2021年空巢青年研究报告:静水流深,不将就的青春.pdf(附下载链接)...
- [framework] debuging
- 《软件开发这点事儿》作者邵志东老师视频发布
- 06. Explicitly disallow the use of compiler-generated functions you do not want
- 基于protues与keli下贪吃蛇的实现
- C++入门项目——通讯管理系统
- 【c语言】计算圆周率的近似值
- 如何将域名和网站转入香港主机
- 财富、通胀与印钞——读《原则2 :应对变化中的世界秩序》(上)
- 学生个人网页设计作品 HTML+CSS+JavaScript仿小米商城(8页) 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计代做
- Swift 方法的多面性
- 专访光之树创始人张佳辰:围绕产业化和商业化落地,迈向隐私科技
热门文章
- js 中控制打印方向横向还是纵向。
- 比较ping,tracert和pathping等命令之间的关系
- 【问】已经不用了的门店,在总部如何删除门店库存
- windows下PHP获取视频第一帧图片作为背景图
- 微信 配置文件 android,微信支付,配置指南 (Android 端) – 热爱改变生活
- delete_failed_internal_error安装失败
- js微信抢红包脚本代码_JavaScript语言基于AutoJs简易微信抢红包参考大佬修改
- Java中的substring()方法
- Python 拼图成心【大小,图数可调节】
- 淘宝/天猫电商API接口详情