zoukankan      html  css  js  c++  java
  • 微服务:整合 Spring Cloud Eureka

    目录

       微服务:整合 Spring Cloud Eureka - 注册中心 Eureka Server 

       微服务:整合 Spring Cloud Eureka - 服务注册 Eureka Client  

       微服务:整合 Spring Cloud Eureka - 服务发现 DiscoveryClient 

       微服务:整合 Spring Cloud Eureka - 服务消费以及Ribbon简单使用 

       微服务:整合 Spring Cloud Eureka - 高可用集群  

       微服务:整合 Spring Cloud Eureka - .NET Core Mvc Api (C#) 

       微服务:整合 Spring Cloud Eureka - 服务治理机制  

       微服务:整合 Spring Cloud Eureka - 服务事件监听  

       微服务:整合 Spring Cloud Eureka - 高级属性Region、Zone

       微服务:整合 Spring Cloud Eureka - Rest接口文档 

       微服务:整合 Spring Cloud Eureka - Security 安全保护

    一、前言

      记得在几年前,在做一个.Net 项目,需要一个服务注册中心,那时候还傻乎乎的自己手写了一个注册中心。虽然简陋,但是对应的心跳以及负载均衡还是有的。现在随着技术日新月异,也要与时俱进。今天和大家分享一个 .NET Core  Mvc Api 如何与Spring Cloud Eureka集成,做服务注册与发现,并和java项目相互调用。

    二、搭建Spring Cloud Eureka 注册中心

     参考 《微服务:整合 Spring Cloud Eureka - 注册中心 Eureka Server 》

    三、搭建Spring Cloud 服务提供者

     参考《微服务:整合 Spring cloud Eureka - 服务注册 Eureka Client

    四、搭建Spring Cloud 服务消费者

     参考《微服务:整合 Spring cloud Eureka - 服务消费以及Ribbon简单使用 》

      修改 demo-service-consumer中 ConsumerHelloController.java中的代码:

    package com.demo.service.consumer.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class ConsumerHelloController {
    
        @Autowired
        RestTemplate restTemplate;
    
        @RequestMapping("/hello/{name}")
        public String hello(@PathVariable("name")String name){
            String ribbon_url = "http://demo-service-provider/hello/sayhello/" + name;
            String msg =restTemplate.getForEntity(ribbon_url,String.class).getBody();
            System.out.println("服务返回信息为:" + msg);
            return "服务返回信息为:" + msg;
        }
    
        @RequestMapping("/netapi/values")
        public String netapi(){
            String ribbon_url = "http://net-core-app4/api/values"; // .net 服务地址
            String msg =restTemplate.getForEntity(ribbon_url,String.class).getBody();
            System.out.println("服务返回信息为:" + msg);
            return "服务返回信息为:" + msg;
        }
    }

    五、搭建Asp.Net Core Mvc Api 项目

    1、C# 项目结构

     2、IJavaProviderService.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace WebApplication4.Service
    {
        public interface IJavaProviderService
        {
            Task<string> GetValueAsync();
        }
    }

    3、JavaProviderService.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Threading.Tasks;
    
    namespace WebApplication4.Service
    {
        public class JavaProviderService : IJavaProviderService
        {
            private readonly HttpClient _httpClient;
    
            public JavaProviderService(HttpClient httpClient)
            {
                _httpClient = httpClient;
            }
            public async Task<string> GetValueAsync()
            {
                var result = await _httpClient.GetStringAsync("hello/sayhello/java");
                return result;
            }
        } 
    }

    4、ValuesController.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Configuration;
    using WebApplication4.Service;
    
    namespace WebApplication4.Controllers
    {
        [Route("api/[controller]")]
        [ApiController]
        public class ValuesController : ControllerBase
        {
            private readonly IJavaProviderService _javaProviderService;
    
            public ValuesController(IJavaProviderService javaProviderService)
            {
                _javaProviderService = javaProviderService;
            }
    
    
            // GET api/values
            // 供Java项目调用
            [HttpGet]
            public ActionResult<IEnumerable<string>> Get()
            {
                return new string[] { "value1", "value2" };
            }
    
            // GET api/values
            // .Net 通过Eureka调用java服务
            [Route("java")]
            [HttpGet]
            public async Task<string> Getsss()
            {
                return $"client { await _javaProviderService.GetValueAsync()}";
            }
    
        }
    }

    5、Program.cs

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Logging;
    
    namespace WebApplication4
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                CreateWebHostBuilder(args).Build().Run();
            }
    
            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .UseUrls("http://*:5001");
        }
    }

    6、Startup.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;
    using Microsoft.Extensions.Options;
    using Steeltoe.Common.Http.Discovery;
    using Steeltoe.Discovery.Client;
    using WebApplication4.Service;
    
    namespace WebApplication4
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddDiscoveryClient(Configuration);
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    
                services.AddTransient<DiscoveryHttpMessageHandler>();
    
                // 指定 BaseService 内使用的 HttpClient 在发送请求前通过 DiscoveryHttpMessageHandler 解析 BaseAddress 为已注册服务的 host:port
                services.AddHttpClient("java-provider-service", c =>
                {
                    c.BaseAddress = new Uri(Configuration["services:java-provider-service:url"]);
                })
                .AddHttpMessageHandler<DiscoveryHttpMessageHandler>()
                .AddTypedClient<IJavaProviderService, JavaProviderService>();
    
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseMvc();
                app.UseDiscoveryClient();
            }
        }
    }

    7、appsettings.json

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "spring": {
        "application": {
          "name": "net-core-app4"
        }
      },
      "eureka": {
        "client": {
          "serviceUrl": "http://localhost:8001/register/eureka/",
          "shouldFetchRegistry": true,
          "shouldRegisterWithEureka": true,
          "validate_certificates": false
        },
        "instance": {
          "hostname": "localhost",
          "port": 5001,
          "instanceId": "localhost:net-core-app4:5001"
        }
      },
      "services": {
        "java-provider-service": {
          "url": "http://demo-service-provider/"
        }
      },
      "AllowedHosts": "*"
    }

    8、launchSettings.json

    {
      "$schema": "http://json.schemastore.org/launchsettings.json",
      "iisSettings": {
        "windowsAuthentication": false, 
        "anonymousAuthentication": true,
        "iisExpress": {
          "applicationUrl": "http://localhost:5001",
          "sslPort": 0
        }
      },
      "profiles": {
        "IIS Express": {
          "commandName": "IISExpress",
          "launchBrowser": true,
          "launchUrl": "api/values",
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        },
        "WebApplication4": {
          "commandName": "Project",
          "launchBrowser": true,
          "launchUrl": "api/values",
          "applicationUrl": "http://localhost:5000",
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        }
      }
    }

    六、启动项目

    1、启动Eureka 注册中心

    2、启动demo-service-provider服务提供者,可启动两个实例

    3、启动demo-service-consumer服务消费者

    4、启动.NET 项目WebApplication4

    5、验证:

      如果启动成功,我们可以看到如下两个界面:

     

     七、测试接口

    1、java中demo-service-provider调用.Net 接口:http://localhost:8201/netapi/values

     2、.Net 调用 Java 服务接口:

    .net和Java之间的服务接口相互调用测试成功!

      

  • 相关阅读:
    2012 里SQL Server Data Tools进程处理数据库时 怎么没有更改设置呢?
    如何重启数据库服务
    如何更改sql server登陆密码
    备份和还原数据库
    MySQL查询优化之性能提升一个数量级
    浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
    浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)
    模板在二叉树和队列中的应用(借助队列广度遍历二叉树)
    SSH公钥登录且禁止密码登录及更改默认端口
    springmvc+druid+dataSource配置的两种方式
  • 原文地址:https://www.cnblogs.com/yansg/p/12560619.html
Copyright © 2011-2022 走看看