## 前言
  本系列教程旨在为大家演示如何一步一步构建一整套微服务系统,至于其中的数据库用什么,订单ID如何保持唯一,分布式相关问题等等不在我们讨论范围内,本教程为了方便大家后续下载代码运行测试,不依赖任何其他诸如缓存、数据库之类的资源,此类操作我们在项目中使用代码的方式来模拟。

  我们的实战过程会教童鞋们一步一步进行演化,让童鞋们了解一个微服务的开发流程:
  1.创建两个用于演示的springboot项目,用于后续将其演化为两个微服务.
  2.使用Eureka注册中心进行服务治理.
  3.使用Ribbon进行负载均衡.
  4.整合Feign接口服务.
  5.服务降级与熔断Hystrix.
  6.API网关zuul进行路由.
  7.使用config配置中心.

## 创建演示服务
  在本实战教程中,我们会模拟一个最简单的业务场景:生产者生产商品,消费者消费商品,这会涉及两个服务,生产者和消费者,因此我们需要先创建这两个服务.为方便演示,我将他们放到一个maven工程中。
首先创建该maven工程:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114432270-751307565.jpg)

等待创建完成:

![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114432536-562529543.jpg)

然后创建一个生产者,该生产者是一个springboot项目:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114432753-77226302.jpg)

点击next:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114433188-383241741.jpg)

继续点击next:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114433455-1017855516.jpg)

生产者就生成好了,接下来,我们把该模块加入父项目:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114433944-288464036.jpg)

然后实现生产者相关代码:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114434484-524571683.jpg)

其中的数据库操作我们使用map来模拟:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114434955-1396071804.jpg)

在application.properties中配置一下服务端口号:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114435227-315011956.jpg)

然后启动项目看一下:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114435455-1062140787.jpg)

生产者就完成了. 接下来是消费者项目,同样创建一个springboot项目:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114435930-1968396897.jpg)
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114436175-21727497.jpg)
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114436923-1514388874.jpg)

同样纳入父工程项目:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114437207-286999264.jpg)

然后编写相关代码:在消费者端,我们使用spring RestTemplate和生产者进行通信:
首先需要配置一下restTemplate:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114437700-1290685106.jpg)

然后编写controller:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114438202-1608531284.jpg)

注意:在consumer项目中也需要使用Product对象,本文直接从producer项目中拷贝过来:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114438762-1450267596.jpg)

实际生产中根据业务需要,有可能需要根据返回字段构造一结果个对象,也有可能让调用的服务提供方提供jar包.

在appilication.properties配置一下启动端口:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114438995-739168472.jpg)

然后我们去浏览器访问一下试一下:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114439180-1036104860.jpg)

可以看到,在消费者端的代码已经通过restTemplate访问到生产者提供的接口.

## 使用spring-security进行用户认证

  接下来,我们思考一个问题:假如我们的接口需要对公网开放,如果对接口不加任何限制,任何人都能访问,是不是不安全呢?因此,我们需要添加一个认证小模块.该模块我们使用spring-security来实现,首先添加依赖:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114439377-1926515593.jpg)

然后在配置文件中新增相关信息:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114439576-1657006294.jpg)

然后重启生产者服务,访问浏览器,此时浏览器提示需要登陆,账号密码就是我们在配置文件中配置的信息:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114439791-542261506.jpg)

输入配置文件中配置的账号密码就能成功访问了:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114440004-574818784.jpg)

此时,我们再来访问consumer项目试一试:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114440218-1504898602.jpg)

页面提示信息说认证失败,因此,我们还需要修改consumer项目的代码,新增一个httpheaders头信息,添加账号密码进行认证:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114440551-1949865340.jpg)

然后修改controller层代码:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114440785-423747983.jpg)

然后再重启访问浏览器:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114440997-285372420.jpg)

此时我们又能在consumer中访问到producer的接口了.

## spring-security抽象

  设想一下,假如我们有数十甚至上百个微服务,难道要在每一个模块中都设置这样的账号密码?答案肯定是否定的,一般来说,一个微服务系统中的所有微服务都使用相同的用户名和密码进行认证,我们可以将认证功能单独抽出来形成一个模块,然后再集成到需要进行认证的微服务中去,因此我们再新建一个模块:

![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114441254-2000060206.jpg)
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114441507-1450699508.jpg)

创建项目完成后,首先新增pom.xml依赖:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114441749-1004151182.jpg)

整个项目结构如下:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114442427-952272443.jpg)

resources目录下没有任何文件,接下来看看最重要的WebSecurityConfiguration:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114442738-180037260.jpg)

首先使用@Configuration标识它是一个配置类,需要被spring容器扫描.

其次@EnableWebSecurity标志启用WebSecurity安全相关的功能.

最后是继承自WebSecurityConfigurerAdapter,从名字我们可以看出,该类采用了适配器模式,主要作用是进行安全相关的配置,有兴趣的童鞋可以详细去了解一下,在此我们主要演示spring-cloud,就不再过多赘述.

把该模块加入父项目:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114443239-1832701102.jpg)

接下来,我们需要修改producer项目的代码,取消自定义的安全配置,使用dhp-micro-service-auth来替代.
首先修改producer项目的pom.xml:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114443505-492067403.jpg)

然后去掉application.properties中的配置:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114443760-1189608880.jpg)

接下来再启动producer项目,使用浏览器进行访问:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114443982-683270228.jpg)

输入账号密码,认证成功后能正常访问:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114444195-1333045569.jpg)

此时,再启动consumer项目访问:
![file](https://img2018.cnblogs.com/blog/1924225/202001/1924225-20200118114444428-1278742296.jpg)

说明我们的公共验证模块成功应用到了producer项目,后续再有新的微服务需要用户认证,直接引入该模块即可.
自此,我们需要的服务都有了.文末,请童鞋们思考一下,本文中consumer访问producer的方式有什么问题?我们会在下一篇文章来解答这个问题.

[本文的github地址](https://github.com/dongheping/dhp-micro-service-chapter1)

> 本文由博客一文多发平台 [OpenWrite](https://openwrite.cn?from=article_bottom) 发布!

Spring-cloud微服务实战【二】:eureka注册中心(上)的更多相关文章

  1. Spring Cloud 微服务实战——nacos 服务注册中心搭建(附源码)

    作为微服务的基础功能之一的注册中心担任重要的角色.微服务将单体的服务拆分成不同的模块下的服务,而不同的模块的服务如果进行通信调用呢?这就需要服务注册与发现.本文将使用阿里开源项目 nacos 搭建服务 ...

  2. Spring Cloud微服务实战阅读笔记(一) 基础知识

    本文系<Spring Cloud微服务实战>作者:翟永超,一书的阅读笔记. 一:基础知识   1:什么是微服务架构     是一种架构设计风格,主旨是将一个原本独立的系统拆分成多个小型服务 ...

  3. Spring Cloud 微服务实战笔记

    Spring Cloud 微服务实战笔记 微服务知识 传统开发所有业务逻辑都在一个应用中, 开发,测试,部署随着需求增加会不断为单个项目增加不同业务模块:前端展现也不局限于html视图模板的形式,后端 ...

  4. spring cloud微服务实战教程/pdf/视频/百度云资源

    资源站:http://www.supan.vip 点击进入直接查找资源: http://www.supan.vip/spring%20cloud微服务实战 <Spring Cloud微服务实战& ...

  5. Spring cloud微服务实战——基于OAUTH2.0统一认证授权的微服务基础架构

    https://blog.csdn.net/w1054993544/article/details/78932614

  6. SpringCloud(二) - Eureka注册中心,feign远程调用,hystrix降级和熔断

    1.项目模块介绍 2. 父项目 主要依赖 spring-cloud 的 版本控制 <properties> <!-- springCloud 版本 --> <scd.ve ...

  7. Spring Cloud(一):服务注册中心Eureka

    Spring Cloud 基于 Netflix 的几个开源项目进行了封装,提供包括服务注册与发现(Eureka),智能路由(Zuul),熔断器(Hystrix),客户端负载均衡(Ribbon)等在内的 ...

  8. .Net微服务实战之负载均衡(上)

    系列文章 .Net微服务实战之技术选型篇 .Net微服务实战之技术架构分层篇 .Net微服务实战之DevOps篇 相关源码:https://github.com/SkyChenSky/Sikiro P ...

  9. Spring Cloud 微服务一:Consul注册中心

    Consul介绍 Consul is a service mesh solution providing a full featured control plane with service disc ...

  10. Spring Cloud Alibaba 使用Nacos作为服务注册中心

    为什么需要注册中心? 在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用:服务管理,核心是有个服务注册表,心跳机制动态维护 : 服务注册 创建普通Spring ...

随机推荐

  1. linux 原子变量

    有时, 一个共享资源是一个简单的整数值. 假设你的驱动维护一个共享变量 n_op, 它告 知有多少设备操作目前未完成. 正常地, 即便一个简单的操作例如: n_op++; 可能需要加锁. 某些处理器可 ...

  2. javascript基础的一些总结

    一 闭包 各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂.我的理解是,闭包就是能够读取其他函数内部变量的函数. 由于在Javascript语言中,只有函数内部的子 ...

  3. vue-learning:24 - component - 目录

    component 组件 组件的概念 Vue 组件同时也都是 Vue 实例,可接受相同的选项对象option (除了一些根级特有的选项) 和使用相同的生命周期钩子,以及模板调用方式. 组件的构建和注册 ...

  4. 北京信息科技大学第十一届程序设计竞赛E-- kotori和素因子(深搜)

    链接:https://ac.nowcoder.com/acm/contest/940/E 题目描述 kotori拿到了一些正整数.她决定从每个正整数取出一个素因子.但是,kotori有强迫症,她不允许 ...

  5. Loj3033 JOISC 2019 Day2两个天线

    Loj3033 JOISC 2019 Day2两个天线 下午唯一听懂的题目但,但还是比较模糊.写一篇题解来加深一下印象. 题目大意:给定\(n\)根天线,第\(i\)跟天线的高度为\(h_i\),切它 ...

  6. [luogu1908]逆序对(upper_bound)

    对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对 用upper_bound法求逆序对,Code很棒 据说有用树状数组和线段树写逆序对的,这里用upper_bound水一 ...

  7. Android一般什么情况下会导致内存泄漏

    资料参考:https://blog.csdn.net/u011479990/article/details/78480091 内存泄漏的原因在于生命周期长的对象持有了生命周期短的对象的引用 内存泄漏形 ...

  8. Python6_模块、包、import、from import的解释

    先说一下模块和包是什么? 模块(module):简单来说一个模块(module)就是一个py文件.在python中是这么约定. 模块里面有函数.类,就是一组代码的集合.   模块显然要有一个名字,这个 ...

  9. Logback 学习指南 一

    因为项目中用到 SpringBoot,看到官方文档中提及默认的日志实现是 logback,因此就通过阅读手册和结合实践学习了下相关的知识,记录下以备查阅. 1. logback 是什么? logbac ...

  10. 洛谷$P$2522 $Problem\ b\ [HAOI2011]$ 莫比乌斯反演

    正解:莫比乌斯反演 解题报告: 传送门! 首先看到这个显然就想到莫比乌斯反演$QwQ$? 就先瞎搞下呗$QwQ$ $gcd(x,y)=k$,即$gcd(\left \lfloor \frac{x}{k ...