天天看点

ssm项目day7

1.maven创建springboot工程

1.pom里面导springboot依赖

2.主启动类上标@SpringBootApplication注解,该类中main方法里进行

SpringApplication.run

3.完成,如有需要另加yml或者properties配置文件

[email protected]注解的含义:

@SpringBootConfiguration:约等于spring中的@Configuration

@EnableAutoConfiguration

@ComponentScan:包扫描,默认约定扫描启动类所在包下的所有类

如果需要改扫描位置,可以在启动类上重写@ComponentScan注解,但此时约定扫描规则会失效

3。springboot版本仲裁

在springboot项目中我们继承的spring-boot-starter-parent项目,有父项目,在它的父项目pom文件中,已经完全规定好了需要用到的依赖,经过严格测试后的版本,因此,在我们的pom文件中,引用已经规定好的依赖不需要再声明版本,避免版本问题。

4.springboot配置文件

1./main/resources目录下

2.application.properties和application.yml二选一

注意:springboot实际上是有自动配置的,我们只不过是在修改自动配置而已

5.yml语法需要注意的地方

冒号后面必须有一个空格!!!

yml对key value大小写敏感

在yml中写map

分为常规写法和行内写法

在yml中写数组

分为常规写法和行内写法

略,上网找找有笔记的

6.在java类中使用yml配置的数据

使用**@Component**将要使用属性的类加入到容器中

@ConfigurationProperties( prefix = “student”)

使用@ConfigurationProperties表示将配置文件中的对应属性的值加入到组件之中

prefix限定了配置文件中属性的范围,当我们指定了student之后,只有student下面的属性会被注入

在pom文件中加入spring-boot-configuration-processor依赖(帮助在编写yml的时候给提示)

然后就可以通过yml的配置,填充类中的属性

7.使用@Value注解读取配置文件

@Value注解能够更加简单的读取yml配置中的值,但是仅限该值为简单类型数据

@Value(“${xxx.xxx.xxx}”)

8.修改springboot日志级别为debug

全局修改为debug(这个会打印海量的日志,不推荐)

logging:

level:

root: debug

特定包修改为debug

logging:

level:

包名: debug

一般是mybatis查验SQL语句的时候使用

8。springboot的一些注解

@Configuration注解:同spring中该注解的作用,在类名上加上之后,该类成为一个配置类,加载在这个类中的配置可以取代xml文件。

@Bean注解:相当于spring中的bean标签,把一个类加入到ioc容器中

@Import注解:也可以更便捷的将一个类加入到ioc容器中

@Import(EmployeeHandler.class)

@Conditional注解:一个类在满足特定条件后才加入IOC容器(常应用于各种AutoConfiguration类中)

@ComponentScan:包扫描

@AutoConfigurationPackage注解:指定自动化配置的包

9.springboot工作原理

1.读取spring.factories文件,在spring-boot-autoconfigure包下,读取值自动加载配置类。

2.加载XxxProperties类

3.根据@ConditionalXxx注解决定加载哪些组件

ssm项目day7
ssm项目day7

10.springcloud核心

基于http协议的,dubbo是基于RPC的,这是最本质的不同。

用到的组件:

注册中心:Eureka

客户端负载均衡:Ribbon

声明式远程方法调用:Feign

服务的降级、熔断:Hystrix

网关:Zuul

consumer:服务消费者,就是调用provider的人

provider:服务提供者,就是给consumer提供服务的人

下图是springcloud各个组件的一个大致工作流程

ssm项目day7

springcloud是工作在springboot的基础上的

11.Eureka服务的建立

Eureka服务

1.在pom.xml中导入Eureka依赖

依赖是eureka-server

2.在主启动类上标注@EnableEurekaServer

3.配置类配置相关信息(具体略)server信息和eureka信息

4.通过springboot启动Eureka服务器端

需要加入Eureka的Provider模块

1.在pom.xml中导入Eureka依赖

依赖是eureka-client

2.在配置文件中配置(具体略)eureka信息,应用名称信息

以后在springcloud中开发,每一个应用都要设置应用名称

3.在主启动类上加入@EnableEurekaClient(springcloud高版本好像可以省略该步)

consumer通过Eureka订阅Provider

1.在pom.xml中导入Eureka依赖

依赖是eureka-client和Ribbon

2.在配置文件中配置(具体略)eureka信息

idea中同时启动多个不同端口的同一微服务实例,开启微服务集群

run-edit-configurations 在配置里勾上Allow parallel run

注意 微服务名称必须相同才会被认定为属于同一个集群

12.Ribbon

客户端的负载均衡,根据微服务的名称访问微服务的具体实例,在导入feign的同时会自动导入。

大致工作原理:

首先consumer请求会到Ribbon处,Ribbon根据微服务的名称,去eureka找该服务集群中实例的具体地址和端口号,然后内部决定调用该集群中的哪一个实例

13.Feign

Feign是声明式方法远程调用的模块。

0.导入依赖

1.consumer模块要主启动类上开启@EnableFeignClients

然后直接装配common模块中的接口类即可(例如XxxService)

2.common模块需要定义provider模块要实现的接口,并且标注

@FeignClients(“provider微服务名称”)

3.provider实现common中定义的接口(provider和common中方法的声明必须一致)

Feign需要传参的情况下,provider也要写对应的注解,最好与consumer的handler中的方法上的一致,如@RequestParam等

14.Hystrix

服务雪崩 某个微服务出问题之后,由于未设定处理办法(熔断、降级),使得大量其他服务无法调用该服务从而导致整条服务链无法继续运行,被称为服务雪崩。

provider提供熔断方法:

0.导入依赖

1.在provider主启动类上加注解@EnableCircuitBreaker

2.在需要提供熔断方法的handler方法上标注解@HystrixCommand(fallbackMethod=“xxxMethod”)

这就指定了,该方法如果出问题,去找xxxMethod处理

降级方法

0.在common工程(provider和consumer都依赖的那个工程)中导入hystrix依赖。

1.在包扫描的范围下写自己实现的FallbackFactory,类上加@Component标签(必须加入IOC容器否则检查不到)。在里面的create方法中,new一个service,该service就是consumer调用provider的那个service

ssm项目day7

2.在接口上FeignClient注解括号中,加入fallbackFactory=“fallback工厂名”

3.在consumer工程中:yml中开启Hystrix(enable=true)

Hystrix也能做监控

15.zuul网关

客户端直接与各种微服务通信会有诸多不方便

1.跨域请求,在浏览器上会出现诸多阻碍

2.客户端多次请求,增加客户端复杂性

3.认证复杂,每一个微服务都需要一个认证

4.难以重构,如果微服务架构做出调整,客户端重构困难

5.某些微服务可能还会带有其他协议

Zuul包含了请求的路由和过滤两个最主要的功能

ssm项目day7

使用方法:

1.创建zuul工程,导入相关依赖,主启动类加注解@EnableZuulProxy

访问网址如下

ssm项目day7

如何给微服务起别名,防止暴露微服务名称

ssm项目day7

然后忽略微服务名称

ssm项目day7

给访问路径加前缀

ssm项目day7

地址:如果server又配了ContextPath,那么访问网址应该是

ip:端口号/${ContextPath}/{prefix}/微服务别名/接口网址

zuulfilter

可以在zuul工程中写XxxZuulFilter

实际上如果把多个微服务整合起来看成一个大项目的话,那么zuulfilter就是整个大项目的拦截器。

在每个微服务的内部也可以写自己专有的拦截器,而在zuul项目中写整个大项目用到的拦截器。