SpringCloud 练手实例(修图版)

2019-01-23  本文已影响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共享

上一篇下一篇

猜你喜欢

热点阅读