美文网首页
SpringCloud 练手实例(修图版)

SpringCloud 练手实例(修图版)

作者: 青色沙丘 | 来源:发表于2019-01-23 18:54 被阅读0次

    码云地址:https://gitee.com/527184687/cloudproject

    重修版地址:https://gitee.com/527184687/cloud-test

    1.开发环境window,工具idea 2018

    2.准备 plugins 安装spring boot 插件 2018版在线插件老是链接超时,没法只能本地安装插件了。

    https://plugins.jetbrains.com/ 查询插件下载下来,然后本地安装。

    安装成功后New Module 中会出现

    spring Cloud 组件有很多,并且还在持续更新和增加中

    在这里我们只做基础练手的SpringCloud

    0.简介

    1.服务注册和服务发现。

        zookeeper、consul、Eureka等,Netflix 公司在 github 上公告 Eureka 2.0 开源工作停止,继续使用风险自负。但是Eureka还是比较稳定和简单的,这里我们用Eureka做服务发现注册

    2.客户端负载均衡组件

      ribbon

    3.Feign 声明式REST客户端

      微服务之间的调用本质还是http请求,只要是http请求的都可以使用feign,帮助我解决代码的重复编写,fegin整合了ribbon,默认会使用ribbon的负载策略。

      feign最重要的作用是整合业务中多个http请求为一个resfult 接口。如:用户服务,文章服务。一般两个服务我们会先查询用户接口,然后通过用户的信息查询用户的文章,这得查询两个接口,并且还有逻辑顺序在里面。而feign就是解决接口调用逻辑,防止因调用逻辑错误导致崩溃问题。

    4.网关组件

      zuul提供动态路由,监控,弹性,安全等边缘服务的框架。可以做filter、session等。

    还有hystrix断路器、spring cloud config远程配置服务等,spring Cloud 还有其他组件后续再研究

    好了,准备完了咱们开始。

    1.新建一个maven project

        新建一个空白的maven project

    一直到finish

    这个maven 是一个工程包,打包用。

    2.服务的注册与发现

        创建子module

    中间是服务发现的组件我们用的eureka,选中那个spring initializr会自动帮我们在pom添加上maven路径

    这是spring initializr生成的module

    这里需要在cloudtest(父类project)pom.xml手动添加,否则从新导入maven项目时,ide无法显示模块关系

    <!-- 引入SpringCloud微服务常用组件-->

    <modules>

            <module>eureka</module>

    </modules>

    Sping Cloud基于SpringBoot,而SpringBoot这个框架使用的是application.properties或者是application.yml,properties优先级高于yml。两者区别是一个是.分隔,一个是:分隔看个人习惯。这里我两个都写了。

    eureka详细配置说明这里 Spring Cloud Eureka 常用配置及说明

    最后在spring boot启动类上加上注解

    @EnableEurekaServer //eureka服务注册中心

    到这里eureka的服务发现与注册完成了,咱们来试一下

    访问localhost:8801

    咱们的eureka成功了。

    3.创建服务

        这里有个概念:服务提供者和服务消费者

        服务提供者:服务的被调用方,即为其他服务提供服务的服务。

        服务消费者:服务的调用方,即依赖其他服务的服务。

    这个概念网上都是这么说的,但是两者代码没有什么区别。网上查询资料和思考,这里它们还真的只是概念。它没有调用其他服务,只提供服务它就是提供者;它调了其他服务,它就是消费者,它要是两者都是也行。这里真的很烦人,好多文章语文能力不够的还不一定能读懂呢o(* ̄▽ ̄*)o

    前几步跟上面一样

    这里不一样,不一样,不一样!选择了Eureka 服务注册,要是不选它会怎样呢?结果是不选它,你上面的Eureka是不能发现你这个user-service服务的。还有Ribbon负载均衡器,这个不选它会怎么样呢?实例中没什么影响,但是如果你要启用多个user-service那你就需要它了。

    finish 完成

    再次感觉spring initializr真方便。( •̀ ω •́ )✧

    先写配置文件

    server.port=8802

    spring.application.name=user-service

    服务端口8802 服务名称是user-service。要是负载的话spring.application.name=user-service可以是一个,端口可以开多个。

    spring boot启动类添加注释@EnableDiscoveryClient或者@EnableEurekaClient 两个都是注册。

    注册中心是eureka使用@EnableEurekaClient这个只为Eureka服务,其他的注册中心使用

    @EnableDiscoveryClient,包括Eureka。所以这里咱们使用@EnableDiscoveryClient

    先创建service,输出"user-service:张三";要结合mybatis的话,跟springboot和springMVC类似。

    然后创建Controller

    咱们用的是@RestController,这里有@Controller和@RestController的区别呢,区别就是@RestController注解相当于@ResponseBody + @Controller合在一起的作用。

    spring boot @RequestMapping @GetMapping @PostMapping 这几个区别是,@GetMapping和@PostMapping 是@RequestMapping +method = RequestMethod.GET的缩写

    这里有个坑点 要返回JSON数据的话需要头部加上

    produces = MediaType.APPLICATION_JSON_UTF8_VALUE

    相当于response设置Content-Type=application/json;charset=UTF-8

    如果不设置,返回默认是xml格式。这里可以通过实现WebMvcConfigurer中configureContentNegotiation来统一配置。

    //使用两个注解

    @Configuration

    @EnableWebMvc

    这样就省去每个接口都要produces了,并且parameterName("mediaType")根据mediaType参数返回xml或者json两种格式。还可以通过后缀来实现如 getuser.json或者getuser.xml

    每个服务很少会只启动一个,一般都会做负载。

    下面咱们给这个user-service 做个负载

    在spring boot启动类上添加bean。@LoadBalanced 注解就是启用负载,其他策略配置请看

    Ribbon负载均衡策略配置 - Lovnx - CSDN博客

    user-service启动多个8802、8803、8804

    这里只需要增加三个配置文件就和一个主配置文件

    配置文件命名规则必须是:

    application-{profile}.properties/application-{profile}.properties

    咱们把之前的配置文件改一下。

    先复制3个application.properties改名

    springboot中spring.profiles.active来具体激活一个或者多个配置文件的。

    所以application.properties中只需要写

    spring.profiles.active=8802

    启动其他几个服务只需要修改spring.profiles.active等于的值就行了。

    这里yml格式配置清晰明了好书写。建议使用yml

    打包后使用 java -jar xxx.jar --spring.profiles.active=8804 来启用不同的配置文件

    yml 格式支持两种模式一种和.properties一样多个文件-分隔,另一种是写在一个文件中

    https://blog.csdn.net/swordsnapliu/article/details/78540902

    命令行启动:

    启动多个可以自己实验一下。

    idea要启动三个相同服务需要configureactions中复制三个,否则直接右键run会弹出stop and return 只能启动一个。

    Override parameters 启动的附加参数:这样可以通过ide 启动多个。

    好咱们启动。咱们看一下效果

    分别访问一下

    8802,8803,8804

    完美!ヾ(≧▽≦*)o

    4.声明式REST客户端

    负载什么时候用呢?这里zuul时用、feign RPC时用、只要远程服务调用就会启动负载。咱们都试试。

    RPC与REST区别:RPC是框架,REST是框架风格。

    feign的RPC

        重复上面的动作

    这里选择的时feign

    先来配置文件咱们用9000端口

    spring boot 启动类添加注解

    @EnableDiscoveryClient或者@EnableEurekaClient

    @EnableFeignClients //RPC扫描

    创建RPC:

    添加注解

    @FeignClient("user-service") //告诉RPC访问那个服务

    @RequestMapping(value = "/getuser?name=RPC-9000") //调用服务那个接口

    为了大家能感知到我给接口传参name=RPC-9000

    创建Controller,要使用restTemplate 需要在启动类里添加RestTemplate的实现

    并且改造一下user-service的Controller,增加了参数name,谁调用的。

    启动测试,第一次端口8004,getuserRPC

    F5刷新一下,变成了8803,再刷新输出结果端口变化。

    说明,负载是起作用的。完美!( ̄▽ ̄)"

    另一种调用方式通过RestTemplate 进行服务间调用

    先在启动类中增加RestTemplate,你也可以直接new 对象。上面有提到。

    然后增加一个接口 /getuserREST。我不太喜欢这种风格。代码中固化的变量和暴露的东西有点多,不喜欢这种风格。

    可以看一下【架构师】微服务架构--REST与RPC - 老莫的博客 - CSDN博客

    看一下区别

    5.zuul网关

      先来说一下网关的必要性请看【微服务】Zuul的必要性 - 海棠不惜胭脂色,独立蒙蒙细雨中 - CSDN博客

    个人认为网关最重要的作用是

    安全验证

    过滤保护

    流量管理和控制

    说白话就是你家小区看大门的大爷,谁能进、谁不能进(安全验证);送外卖的能进,送快递的不能进(过滤保护);开一次闸杆只能进一辆车,小车来了闸杆开5s,大车来了开15s(流量管理和控制);

    要是没有这个这个网关呢,在流量小的时候不会有事,只要流量上来了。分分钟把你小区堵死瘫痪掉。

    创建方式与之前一样,不一样的是这里勾选zuul,到这大家发现这个new Module只是控制了pom,要是忘了勾选了,自己修改在pom中添加组件所需的jar包一样的。没什么神奇的,程序员就是要懒。

    先修改配置文件这里注意一下,zuul 两种写法我喜欢第一种直观。

    zuul.routes.user-service=/api-a/**

    这是把user-service服务编程/api-a/getuser

    zuul.routes.user-service=/api-a/**

    #等同于一下写法

    #zuul.routes.provider.path=/api-a/**

    #zuul.routes.provider.serviceId=user-service

    #yml写法

    zuul:

      routes:

        user-service: /api-a/**

    spring boot 启动类注解

    @EnableZuulProxy

    @EnableDiscoveryClient

    基础的zuul已经算完事了,其他的过滤啊,session啊,熔断啊,流量控制啊。在这就不写了,不然太多了。

    启动测试一下,第一次是8802

    刷新一下,编程了8803

    到这咱们的SpringCloud 练手实例基本完事!o(* ̄▽ ̄*)o

    红色文字描述,是Eureka心跳检测警告。

    这里我尝试使用原JSP项目升级,网上找了一些cloud jsp 不能使用。自己尝试后找到一些坑点

    第一步:

    配置文件和目录结构:

    自己创建缺失文件夹

    --webapp

      --WEB-INF

       --index.html

    pom.xml 增加jstl 解析模板

    properties 只定义了编码相关,网上有的把视图配置也放进去,我尝试了。不起作用。后来我找到使用一下注解也可以控制配置

    @Configuration

    @EnableWebMvc

    配置:

    创建html和controller:

    我这里也想做个负载试试行不行

    跟UserServer一样操作过程

    但是,要是使用idea 的Run/Debug Configurations 需要几个地方注意一下。

    测试:

    尝试一下负载:

    修改feign

    重启测试一下:

    o( ̄▽ ̄)d居然可行啊,这样一个简单的前端负载就可以了。不用搞nginx 那一套。微型负载可以满足小用户量需要求了。

    赞!!!!!!!!!!!!!!!!

    通过分析研究Spring Cloud神秘面纱已经揭开了一点。管中窥豹,可见一斑。这个Spring Cloud自由度很高,耦合很低的框架。基本上每一个功能使用插件都可以进行替换 如:我不用zuul用gatway等等;每一个功能都可以互相替换并且还可以做分布式,如:feign与zuul互换,feign也可以在做负载,等等。

    网上关于Spring Cloud 相关理论很多自己去看看。理解了思想才重要。

    下一次我写一下spring Cloud 连接数据库使用阿里的druid连接池和filter 过滤器和session共享

    相关文章

      网友评论

          本文标题:SpringCloud 练手实例(修图版)

          本文链接:https://www.haomeiwen.com/subject/dmtjjqtx.html