前言

Spring Cloud很火,很多文章都有介绍如何使用,但对于我这种初学者,我需要从创建项目开始学起,所以这些文章对于我的启蒙,帮助不大,所以只好自己写一篇文章,用于备忘。

SpringCloud是封装了Netflix公司开发的Eureka模块来实现服务注册和发现。下图为Spring Cloud Eureka的本版列表:

下图为Spring Cloud 微服务的各个实现的总览。

创建父项目

首先,我们打开IEDA创建项目,然后选择Maven选项,然后点击下一步,如下图:

创建完成后,是一个空的Java父项目,如下图:

创建服务查询中心子项目——EurekaServer

EurekaServer是用于服务查询的,C#开发者可能更熟悉consul,虽然用法不一样,但实现的效果是一样的。

现在我们创建一个服务查询中心项目,在项目上右键-->new-->Module-->Spring Initializr-->next,选择和父类项目同一版本的jdk,如下图:

然后选择SpringCloudDiscovery—EurekaServer,如下图:

创建完成如下图所示:

打开新建的项目的入口文件——EurekaserverApplication,为EurekaserverApplication类增加注解@EnableEurekaServer,这个注解会将当前类标记为Eureka Server。

然后修改application.properties为application.yml,编写代码如下:

# 配置启动端口
server:port: 5180
# 配置eureka
eureka:instance:hostname: localhostclient:fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为falseregister-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.service-url:# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.默认是http://localhost:8761/eureka/;多个地址可使用','风格.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

可以看到,上面的配置eureka的hostname是localhost,这个是属于服务器端的配置,但还配置了client,里面配置的内容是不把自己作为服务注册到Eureka Server服务查询中,这个配置会让我们看不懂,为什么服务器查询要配置是否把自己注册进服务查询呢?这样配置的确有点奇怪,调查发现,eureka中的服务端也是个客户端,这样做的目的是为了让服务端也可以互相注册,实现高可用,但这样的配置模式,确实很容易让人误解,不过既然已经使用了eureka,我们只能死记硬背了。

PS:具体可以搜索org.springframework.cloud.netflix.eureka. EurekaClientConfigBean来查找相关属性如何配置。

配置好EurekaServer后,我们使用IDEA调试项目,然后在浏览器输入:http://localhost:5180/,EurekaServer运行成功,如下图:

创建普通服务并注册到服务查询中心——EurekaClient

下面我们创建一个WebApi,一个使用了EurekaClient的WebApi,项目会通过EurekaClient 将当前项目注册到服务查询中心里,如下个图:

点击下一步,然后这次我们选择SpringCloudDiscovery—Eureka Discovery Client,如下图:

项目创建成功后,然后我们还是找到入口文件,为KibaApplication类加上@EnableEurekaClient注解,如下图:

然后修改application.properties为application.yml,编写代码如下:

# 启动端口
server:port: 5181
​
spring:application:name: eureka-kiba
# eureka客户端配置,配置要注册的服务查询中心
eureka:client:service-url:defaultZone: http://localhost:5180/eureka # 指定服务注册中心

然后我们在pom.xml里添加spring-boot-starter-web的Jar包引用,代码如下:

  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

然后创建一个controller文件,再创建一个HelloWorld的java类,如下图:

然后编辑HelloWorld类,代码如下:

package com.client.kiba.controller;
​
import org.springframework.web.bind.annotation.*;
​
@RequestMapping(value = "/helloWorld")
@RestController
public class HelloWorld {@RequestMapping(value = "/GetName", method = RequestMethod.GET)public String GetName(){return "我是Kiba518";}@RequestMapping(value = "/GetAge", method = {RequestMethod.GET,RequestMethod.POST})public int GetAge(){return 518;}@PostMapping("/GetAge1")public int GetAge1(){return 518;}@GetMapping("/GetAge2")public int GetAge2(){return 518;}
}

然后启动项目,然后在打开我们的eureka服务查询中心——http://localhost:5180/,可以看到服务已经成功注册进了服务中心。

注意:这里需要单独启动一下我们刚刚建好的项目。

到此,eureka服务注册就介绍完了。

不得不说,eureka把服务注册处理的如此简单,仅仅用配置就搞定了,实在非常优秀。

使用eureka内注册的服务

创建一个新moudle,创建过程如上。

修改Kiba3Application的代码如下:

package com.clinet.kiba3;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
​
@SpringBootApplication
@EnableDiscoveryClient
public class Kiba3Application {
​public static void main(String[] args) {SpringApplication.run(Kiba3Application.class, args);}@Bean@LoadBalancedRestTemplate restTemplate(){return new RestTemplate();}
}

然后创建RemoteController接口,代码如下:

package com.clinet.kiba3.controller;
​
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
​
@RestController
@RequestMapping("/Remote")
public class RemoteController {@AutowiredRestTemplate restTemplate;
​/*** http://localhost:5183/Remote/TestRestRequest* @return*/@GetMapping("/TestRestRequest")public ResponseEntity<String> TestRestRequest() {/*** 第一个参数:url——http://eureka-kiba2/helloWorld/GetName 这里把ip替换为在eureka中注册的名字* 第二个参数:返回值类型*/ResponseEntity<String> entity = restTemplate.getForEntity("http://eureka-kiba2/helloWorld/GetName", String.class);System.out.println("状态码:" + entity.getStatusCode());System.out.println("响应体" + entity.getBody());
​return ResponseEntity.ok(entity.getBody());
​}
}

如上所示,远程调用使用的是RestTemplate,不过调用的URL稍微做了修改,如上所示,我们请求的url地址是【http://eureka-kiba2/helloWorld/GetName】,可以看到,我们将ip替换为了在eureka中注册的应用名了。

在其他的注册中心中,比如consul,也是通过应用名来调用单体服务的,这种调用模式属于潜规则了。

下图为各个单体服务在注册中心注册的应用名。

在网页输入http://localhost:5183/Remote/TestRestRequest,输出结果如下图:

PS:Eureka还可以通过配置实现负载均衡,因为注册到注册中心的服务,使用【协议+应用名+controller】的模式请求,所以将同一个服务发布到不同服务器, 调用时,因为应用名相同,就可以进行请求分流了,进而实现负载均衡了。

网关

网关的作用主要是将请求重新分发。现在我们新建一个项目用于做网关。

与上文一样,在项目上右键-->new-->Module-->Spring Initializr。

然后在选择依赖jar包时,选择Spring Cloud Routing——Getway,如下图:

在Eureka中,网关也是要作为客户端注册进注册中心的。

也就是说,我们必须引用eureka-client,如下:

 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

还要在启动类上增加@EnableEurekaClient注解,如下:

@EnableEurekaClient
@SpringBootApplication
public class GetwayApplication {
​public static void main(String[] args) {SpringApplication.run(GetwayApplication.class, args);}
​
}

然后,我们配置Getway中最复杂的内容,application.yml配置。

详细配置如下:

server:port: 5184
spring:application:name: getwaycloud:gateway:discovery:# locator需要打开,不然通过 lb://.. 方式请求不到locator:enabled: true #开启 Gateway 服务注册中心服务发现routes:- id: kiba1 # 路由的id,要求唯一,通常使用应用名uri: lb://eureka-kiba #lb是一个动态路由协议,后面的eureka-kiba 是要跳转的服务名称。predicates:- Path=/kiba1/helloWorld/** # 指定匹配的controller,也可以指定到方法,比如 - Path=/helloWorld/GetName/** 这里kiba1会在下面被过滤掉,即请求的是lb://eureka-kiba/helloworldfilters:- StripPrefix=1 #过滤掉一个请求前缀# JwtAuthorization- id: kiba2uri: lb://eureka-kiba2predicates:- Path=/kiba2/helloWorld_kiba2/**filters:- StripPrefix=1eureka:client:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://localhost:5180/eureka #注册中心地址
#    healthcheck:
#      enabled: true

请求注册中心的服务采用【协议+应用名+controller】的模式,但在Getway里,需要把协议从http改为了lb,才能请求注册中心的服务,开启lb协议需要配置locator的enable为true。

应用名就是在注册中心注册的应用名,

routes:指定下面就是配置路由的配置模块。

id:路由的id,要求唯一,通常使用应用名。

predicates:断言,就是判断请求是否符合条件,符合条件方可请求,即使用一些已经定义好的配置条件过滤。

predicates—Path:指定匹配的controller,也可以指定到方法,比如 - Path=/helloWorld/**,这样配置的话就是要求,请求url格式必须为http://localhost:5184/helloWorld,不然就请求失败。

filters:过滤,可以过滤请求信息,这里只用到了过滤路由的路径。

filters—StripPrefix:过滤掉请求地址总的路径,每个【/】分割一对路径,这个功能非常有用,因为配置路径时,通常会加上前缀来区分服务,这个过滤可以过滤掉前缀。

配置完成后启动项目,访问如下地址,结果如下:

http://localhost:5184/kiba1/helloWorld/GetName

http://localhost:5184/kiba2/helloWorld_kiba2/GetAge

如上图,我们已经实现了微服务的网关+注册中心+单体服务注册了。

结语

Java的微服务真的非常便捷,通过一篇比较好的文章即可学会,通过简单的配置,就可以搭建完成。真是微服务界的王者。

----------------------------------------------------------------------------------------------------

到此,SpringCloud搭建微服务已经介绍完了。

代码已经传到Github上了,欢迎大家下载。

Github地址:https://github.com/kiba518/kibacloud

----------------------------------------------------------------------------------------------------

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

一个C#开发者学习SpringCloud搭建微服务的心路历程 - kiba518 - 博客园

一个C#开发者学习SpringCloud搭建微服务的心路历程相关推荐

  1. 一个C#开发者用Java搭建Android框架的心路历程

    前言 Java框架实在是太多了,因为是初学乍练,所以,只好以百度为标准选择框架了. Java的框架文章太难写了,因为他引用了太多框架,而没一个框架都有很繁琐的配置,把每个框架都写一遍,就等于写书了:所 ...

  2. SpringCloud入门总结 + 使用SpringCloud搭建微服务项目

    SpringCloud 1.认识微服务 2.认识spring Cloud 3.Spring Cloud Eureka 服务发现框架 3.1认识Eureka 3.2 实战--开发并部署Eureka Se ...

  3. 学习Spring-Cloud –编写微服务

    继续我的Spring-Cloud学习历程, 之前我已经介绍了如何编写典型的基于Spring-Cloud和Netflix OSS的微服务环境的基础架构组件–在此特定实例中,有两个关键组件,用于注册和发现 ...

  4. SpringCloud搭建微服务之Hystrix熔断器

    1. 概述 1.1. 分布式系统需要解决的问题 复杂分布式体系结构中的应用程序有数十个依赖服务,每个依赖服务在某时将不可避免发生异常或失败.多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C ...

  5. 搭建微服务_快速搭建 SpringCloud 微服务开发环境的脚手架

    本文作者:HelloGitHub-秦人 本文适合有 SpringBoot 和 SpringCloud 基础知识的人群,跟着本文可使用和快速搭建 SpringCloud 项目. HelloGitHub ...

  6. SpringCloud + kafka + ELK 搭建微服务日志管理平台

    SpringCloud + kafka + ELK 搭建微服务日志管理平台 2019-12-31,写在前面的话 今天是2019最后一天了,最近几天都在搞这块微服务日志管理的事情,有很多种方案实现,每种 ...

  7. SpringCloud学习一(微服务远程调用案例:入门)

    SpringCloud学习一(微服务远程调用案例:入门) 前提:准备两个数据库,并创建数据库表 项目代码路径:ZhongChunle/cloud-demo: 微服务远程调用接口案例 (github.c ...

  8. 【译文】用Spring Cloud和Docker搭建微服务平台

    by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...

  9. 【SpringCloud】微服务笔记

    写在前面 官方代码地址:https://github.com/zzyybs/atguigu_spirngcloud2020 本文地址:https://blog.csdn.net/hancoder/ar ...

  10. 用Spring Cloud和Docker搭建微服务平台

    This blog series will introduce you to some of the foundational concepts of building a microservice- ...

最新文章

  1. 阿里规定超过三张表禁止JOIN,为啥呢?
  2. java.lang.OutOfMemoryError及解决方案
  3. 用计算机弹没那种命,成熟小女人QQ个性网名 没那种命就别犯那种病
  4. [转]白话阿里巴巴Java开发手册高级篇
  5. python对浏览器的常用操作_Selenium元素的常用操作方法分析
  6. JavaScript学习笔记(一)—— 数据类型
  7. Spring-第1天
  8. java简单图书馆管理系统_简单 图书馆管理系统 Java+Oracle
  9. 解决npm安装时出现run `npm audit fix` to fix them, or `npm audit` for details
  10. 深夜,基友给我发了个某短视频app,我没忍住把它给...
  11. Nginx + Lua搭建文件上传下载服务
  12. 来讲讲什么是元数据和主数据
  13. php新年倒计时源码,2020新年倒计时网页HTML源代码 | 一叶轻舟
  14. MySQL密码正确却无法登录
  15. 缺氧游戏 不给计算机加水,缺氧 泥土用完了怎么办 | 手游网游页游攻略大全
  16. 红蜻蜓截图工具在win7下保存截图为png失败
  17. 201919102004张雪婷(第三次作业)
  18. 互联网快讯:微信上线“仅传输文件”新功能;极米RS Pro 2获用户肯定;网宿科技与奇安信达成战略合作
  19. 电脑程序是如何运行起来的
  20. 柔性电子,常用材料总结

热门文章

  1. 基于STM32的智能抽油烟机系统
  2. SaaS行业验尸报告:他们死于资本狂欢前夜
  3. 9大增长黑客牛人组织盘点,增长黑客发展奠基人!
  4. 【英语阅读】纽约时报 | 护目镜、口罩、雨衣:大流行时代的空中旅行
  5. 在实际项目开发中,你遇到过Spring事务失效的场景吗?如何解决?
  6. 真实世界里的钢铁侠-特斯拉汽车创始人埃隆#183;马斯克(Elon Musk)
  7. 【基础总结】——数学知识
  8. 电脑蓝屏,问题:你的电脑未正确启动,按“重启”以重启你的电脑,有时这样可以解决问题,你还可以按“高级选项”,尝试使用其他选项修复你的电脑
  9. collapse mode 严重_Android工具栏collapseMode问题
  10. Autodesk 3ds Max 2014选择集闪退问题