仅供学习,不喜勿喷,欢迎共同交流学习。后面还会持续更新……
目录
4.1 springBoot从classpatch/static目录的访问
4.2 springBoot对ServletContext目录的访问
5.2 创建全局配置文件application.properties/application.yml
6.3 使用HBuilder工具开发freemarker页面
8.5.1 Mapper接口上通过@Mapper注解扫描mapper接口
8.5.2启动类上通过@MapperScan扫描mapper接口
10 springBoot整合swagger(引入第三方UI)
11.1 @ControllerAdvice + @ExceptionHandler
14.6.3 Provider/Consumer Server注册服务添加用户名和密码信息
1 springBoot整合servlet两种方式
1.1 通过注解注入
- 定义一个普通的servlet类继承HttpServlet,类上使用@WebServlet注解,标记当前类是一个servlet。其中name属性标记servlet名称,urlPatterns标记servlet请求路径;
2.启动类上添加@ServletComponentScan,标记开启servlet/filter/listener注解扫描。
1.2 通过方法注入
- 定义一个普通的servlet类继承HttpServlet,类上不添加任何注解
- 启动类中自定义一个方法,方法名可任意,一般建议命名规则getXX,返回值是ServletRegistrationBean。
2 springBoot整合filter两种方式
2.1 通过注解注入
- 定义一个普通的Filter类实现Filter接口,类上使用@WebFilter注解,标记当前类是一个Filter。其中filterName标记filter名称,urlPatterns标记filter请求路径;
- 代码略……
- 启动类上添加@ServletComponentScan,标记开启servlet/filter/listener注解扫描。
2.2 通过方法注入
- 定义一个普通的filter类实现Filter接口,类上不添加任何注解;
- 启动类中自定义一个方法,方法名可任意,一般建议命名规则getXX,返回值必须是FilterRegistrationBean。
3 springBoot整合listener两种方法
3.1 通过注解注入
- 定义一个普通的Listener类实现Listener接口【具体实现哪个listener接口要看完成什么功能】,类上使用@WebFilter注解,标记当前类是一个listener;
- 代码略……
- 启动类上添加@ServletComponentScan,标记开启servlet/filter/listener注解扫描。
3.2 通过方法注入
- 定义一个普通的filter类实现Filter接口,类上不添加任何注解;
- 启动类中自定义一个方法,方法名可任意,一般建议命名规则getXX,返回值必须是ServletListenerRegistrationBean。
4 springBoot对静态资源的访问
4.1 springBoot从classpatch/static目录的访问
该目录位于src/main/resources/static下
4.2 springBoot对ServletContext目录的访问
该目录位于src/main/webapp下
5 springBoot整合jsp
5.1 添加jsp依赖
由于springBoot并不建议视图层使用jsp技术,因此web启动器里面并没有整合jsp依赖,需要手动导入以下依赖;
5.2 创建全局配置文件application.properties/application.yml
定义jsp前缀和后缀
6 springBoot整合freemarker
6.1 添加freemarker依赖
6.2 创建模板目录
springBoot要求模板形式的视图技术的文件必须放到src/main/resources/templates目录下。该目录是安全的,目录下面的所有内容是不允许直接访问的。
6.3 使用HBuilder工具开发freemarker页面
7 springBoot整合Thymeleaf(重点)
7.1 添加thymeleaf依赖
7.2 创建模板目录
springBoot要求模板形式的视图技术的文件必须放到src/main/resources/templates目录下。该目录是安全的,目录下面的所有内容是不允许直接访问的。
7.3 Thymeleaf基本用法
Thymeleaf是通过特定语法对html视图进行渲染
7.3.1 变量输出和字符串操作
- th:text
在页面输出值,可以是字符串,也可以是el表达式。
- th:value
可以放在input标签中使用。eg:<inputth:value=”${msg}” />
- $(#strings.isEmpty(key))
- 判断字符串key是否为空,返回布尔值,调用的是thymeleaf内置对象
- 调用内置对象一定要用#,大部分的内置对象都以s结尾
- $(#strings.contains(key,’’))
判断字符串key是否包含指定的子串,返回布尔值
- $(#strings.startsWith(key,’’))
判断字符串key是否以指定子串开头,返回布尔值
- $(#strings.endsWith(key,’’))
判断字符串key是否以指定子串结尾,返回布尔值
- $(#strings.length(key))
计算字符串key长度
- $(#strings.indexOf(key,’’))
查找子串在字符串key中的下标,如果没找到返回-1
- $(#strings.substring(key,start,end))
截取字符串,包含开始不包含结束
- $(#strings.toUpperCase(key))
字符串转换成大写
- $(#strings.toLowerCase(key))
字符串转换成大写
7.3.2 日期格式化处理
- $(#datas.formart(key,’yyyy-mm-dd’))
格式化日期,默认编码采用浏览器编码
- $(#datas.year(key)
取指定日期的年份
- $(#datas.month(key)
取指定日期的月份
- $(#datas.day(key)
取指定日期的日
7.3.3 条件判断
- th:if
2. th:switch
7.3.4 迭代遍历
- th:each
index: 当前迭代器下标
count: 当前迭代器计数器,从1开始
size: 当前迭代器长度
even: 当前迭代器是否是偶数
odd: 当前迭代器是否是奇数
first: 当前循环是否是第一条
last:当前循环是否是最后一条
7.3.5 域对象操作
7.3.6 URL表达式
基本语法:@{}
- 绝对路径
2.相对路径(相当于项目的上下文的相对路径)
第一种写法:
第二种写法(同一个tomcat下不同项目的访问路径):
url参数传递
restfull风格传参:id通过地址栏传参,name通过request传参
8 springBoot整合mybatis
8.1 添加依赖
<!-- springBoot对mybatis的支持 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency>
<!-- mysql驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
<!-- 数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.29</version> </dependency> |
8.2 添加jdbc文件
jdbc.ixx-master.driverClassName=com.mysql.jdbc.Driver jdbc.ixx-master.url=jdbc:mysql://127.0.0.1:3306/ixx_studentmanager?useUnicode=true&characterEncoding=utf8 jdbc.ixx-master.username=root jdbc.ixx-master.password=root jdbc.ixx-master.initialSize=5 jdbc.ixx-master.maxActive=5 jdbc.ixx-master.minIdle=1 jdbc.ixx-master.maxWait=6000 jdbc.ixx-master.validationQuery=SELECT1 |
8.3添加链接参数映射类
@ConfigurationProperties:将配置文件中的参数自动封装成实体类
@ConfigurationProperties(prefix="jdbc.ixx-master") publicclassDatasourceProperties { private String driverClassName; private String url; private String username; private String password; private Integer initialSize; private Integer maxActive; private Integer minIdle; private Integer maxWait; private String validationQuery; //因篇幅有限,此处省略get和set方法 } |
8.4 配置数据源连接
@Configuration: 标记当前为配置类,spring容器初始化会扫描当前类,初始化bean
@EnableConfigurationProperties:指定需要哪个类来装载配置信息
@Configuration @EnableConfigurationProperties(DatasourceProperties.class) publicclassDatasourceConfig {
@Bean publicDataSourcegetDataSource(DatasourcePropertiesdataSourceProperties){ DruidDataSourcedataSource = newDruidDataSource(); dataSource.setDriverClassName(dataSourceProperties.getDriverClassName()); dataSource.setUrl(dataSourceProperties.getUrl()); dataSource.setUsername(dataSourceProperties.getUsername()); dataSource.setPassword(dataSourceProperties.getPassword()); dataSource.setInitialSize(dataSourceProperties.getInitialSize()); dataSource.setMaxActive(dataSourceProperties.getMaxActive()); dataSource.setMinIdle(dataSourceProperties.getMinIdle()); dataSource.setMaxWait(dataSourceProperties.getMaxWait()); dataSource.setTimeBetweenEvictionRunsMillis(60000); dataSource.setMinEvictableIdleTimeMillis(25200000); dataSource.setValidationQuery(dataSourceProperties.getValidationQuery()); dataSource.setTestOnBorrow(false); dataSource.setTestOnReturn(false); dataSource.setTestWhileIdle(true); dataSource.setPoolPreparedStatements(true); dataSource.setMaxPoolPreparedStatementPerConnectionSize(100);
returndataSource; } } |
8.5 定义mapper接口
以下两种方式可以让spring容器扫描到我们定义的mapper接口:
8.5.1 Mapper接口上通过@Mapper注解扫描mapper接口
@Mapper publicinterfaceStudentMapper { public Student selectByPrimaryKey(Long id); } |
8.5.2启动类上通过@MapperScan扫描mapper接口
这种方式不需要在mapper接口上使用@Mapper注解
@PropertySource: spring容器启动的时候会加载jdbc文件,后面通过 @ConfigurationProperties将配置文件中封装到实体类中
@SpringBootApplication @PropertySource(value={"classpath:jdbc.properties"})//spring容器启动的时候会加载jdbc文件 @MapperScan(basePackages="com.ixx.learn.mapper")//定义需要扫描的mapper包路径,可以多个 publicclassIxxApplication { publicstaticvoid main(String[] args) { SpringApplication.run(IxxApplication.class, args); } } |
9 springBoot整合swagger(默认配置)
正常情况下,我们都是通过单元测试去测试我们的程序。
缺陷如下:
a) 单元测试文件过多
b)程序上线后,这些文件又不能删掉,因为后面可能代码调整后还需要用到这些文件。系统中存在大量与系统业务无关的代码
swagger优点如下:
a) 使用简洁,哪块代码需要生成doc文档,加上注释类注解即可
b) 生成doc文档支持单元测试,并且不需要额外的开发单元测试类
9.1 添加依赖
<!-- UI是图形界面用到的依赖,网上有很多比较漂亮的UI,如需调整可以用第三方UI替换 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.8.0</version> </dependency> |
9.2 配置Swagger2
@EnableSwagger2 :开启swagger2配置
@Configuration @EnableSwagger2 publicclassSwaggerConfig{ @Bean publicDocketcustomDocket() { returnnew Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() //扫描的包路径,下述路径下面如果有文档注释类的注解,则会自动生成doc文档 .apis(RequestHandlerSelectors.basePackage("com.ixx.learn")) .paths(PathSelectors.any()) .build(); } privateApiInfoapiInfo() { Contact contact = new Contact("闵胜", "可以定义自己博客地址", "minsheng@ule.com"); returnnewApiInfoBuilder() .title("springBoot接口服务") .description("这是一个demo") .contact(contact) .version("1.0.0") .build(); } } |
9.3 添加文档类注解
常用注解(更多注解参考:swagger注释API详细说明):
@Api:对整个入口的说明
@ApiOperation:具体某个接口的说明
@ApiModel:对模型(实体类)的说明
@ApiModelProperty:对实体类属性(字段)说明
@Controller @RequestMapping("/student") @Api(value = "/student", tags = "学生管理入口") publicclassStudentController { @Autowired privateStudentServicestudentService;
@PostMapping("/saveStudent.htm") @ApiOperation(value = "跳转到学生管理页面", notes = "备注信息", response = String.class,httpMethod="GET") @ResponseBody public Map<String,Object>saveStudent(Student stu){ Map<String,Object>stuMap = newHashMap<String,Object>(); Integer num = studentService.insertSelective(stu);
if(num> 0){ stuMap.put("code", CommonConstants.SUCCESS_CODE); stuMap.put("msg", "添加成功"); }else{ stuMap.put("code", CommonConstants.ERROR_CODE); stuMap.put("msg", "添加失败"); }
returnstuMap; } } | |
@ApiModel(description="学生类实体") publicclassStudentTblimplements Serializable{ privatestaticfinallongserialVersionUID = -401388629991134213L; @ApiModelProperty(value="这是主键",name="主键",dataType="长整形") private Long id; @ApiModelProperty(value="学生中文名",name="中文名",dataType="字符类型") private String cnName; @ApiModelProperty(value="学生英文名",name="英文名",dataType="字符类型") private String enName; @ApiModelProperty(value="学生年龄",name="年龄",dataType="短整形") private Integer age; //篇幅有限,此处省略set和get方法 } |
9.4 效果图
访问地址:http://localhost:8080/swagger-ui.html(注:我的项目里把项目上下文去掉,正式项目是有上下文的)
10 springBoot整合swagger(引入第三方UI)
10.1 添加依赖(替换官网UI)
红色字体为替换后的UI,替换前的UI参考9.1
<!-- UI是图形界面用到的依赖,网上有很多比较漂亮的UI,如需调整可以用第三方UI替换 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.6</version> </dependency> |
10.2 配置Swagger2
doc访问路径配置,红色字体为doc新的访问地址,因为是第三方UI,访问地址不同
@Configuration @EnableSwagger2 public class SwaggerConfigextendsWebMvcConfigurerAdapter{ // @Value("${swagger2.enable}") // private boolean enable;//prd环境不需要开启swagger2配置
@Override publicvoidaddResourceHandlers(ResourceHandlerRegistry registry) { // if(enable){//只有本地和beta环境才起开swagger2配置 registry.addResourceHandler("doc.html")//自定义ui替换swagger-ui.html .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); // } } @Bean publicDocketcustomDocket() { returnnew Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() //扫描的包路径,下述路径下面如果有文档注释类的注解,则会自动生成doc文档 .apis(RequestHandlerSelectors.basePackage("com.ixx.learn")) .paths(PathSelectors.any()) .build(); } privateApiInfoapiInfo() { Contact contact = new Contact("闵胜", "可以定义自己博客地址", "minsheng@ule.com"); returnnewApiInfoBuilder() .title("springBoot接口服务") .description("这是一个demo") .contact(contact) .version("1.0.0") .build(); } } |
10.3 添加文档类注解
此处省略,不需要任何修改
10.4 效果图
访问地址:http://localhost:8080/doc.html(注:我的项目里把项目上下文去掉,正式项目是有 上下文的)
11 springBoot整合异常处理器
11.1 @ControllerAdvice + @ExceptionHandler
@ControllerAdvice public class ExceptionInterceptor{
@ExceptionHandler(value=Exception.class)//指定捕获对应的异常 publicvoidprintException(Exception e){ //这里也可以通过不同的异常,返回不同的json数据(返回json需要用@ResponseBody),也可以返回ModelAndView System.out.println(e.getMessage()); } } |
后续再补充……
12 springBoot集成服务监控
12.1 不带监控界面
12.1.1 添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> |
12.1.2 关闭安全校验限制
SpringBoot1.5 1.5含1.5以上版本默认是开启了安全校验配置,这里需要手动关闭
management.security.enabled: false |
12.2 带监控界面
12.2.1 添加依赖
客户端(需要监控的应用)添加依赖: <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.1.6</version> </dependency> |
服务端添加依赖: <!-- springBoot服务监控依赖 --> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.1.6</version> </dependency> |
12.2.2 客服端启动类上开启监控配置
@SpringBootApplication @EnableAdminServer public class IxxApplication {
public static void main(String[] args) { SpringApplication.run(IxxApplication.class, args); } } |
12.2.3 客服端设置服务端监控应用地址
spring.boot.admin.url: 服务端应用地址 management.security.enabled: false//关闭安全校验限制 |
12.2.4 健康检查参数详解
后续再补充
13 springBoot集成springCloud
13.1 常见版本说明
软件版本号:2.0.2.RELEASE
2:主版本号。当功能模块有较大更新或者整体架构发生变化时,主版本号会更新
0:次版本号。次版本表示只是局部的一些变动。
2:修改版本号。一般是bug 的修复或者是小的变动
RELEASE:希腊字母版本号。次版本号用户标注当前版本的软件处于哪个开发阶段
13.2 springCloud版本说明
从上图中,可以看出springCloud包含很多子版本。为了更好的管理每个SpringCloud
的子项目的清单。避免子的版本号与子项目的版本号混淆,springCloud版本号采用伦敦地铁站
的名称做为主版本号。
特别注意:springCloud每个版本都对应了一个springBoot版本号,具体版本信息可以通过
spring.io找到对应的springBoot版本。
13.3 添加依赖
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> |
14 springCloud集成Eureka服务
服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者url 串、路由信息等。服务注册中心是SOA 架构中最基础的设施之一。
14.1 Eureka服务三种角色
14.1.1 Eureka Server
通过Register、Get、Renew 等接口提供服务的注册和发现。
14.1.2 服务提供方(Server Provider)
把自身的服务实例注册到Eureka Server 中
14.1.3 服务调用方(Server Consumer)
通过Eureka Server 获取服务列表,消费服务。
14.2 Eureka Server服务搭建
14.2.1 添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> |
14.2.2 启动类上开启Eureka自动配置
@SpringBootApplication//标识这是一个springBoot程序入口 @EnableEurekaServer//开启eureka服务 public class SpringEurekaServerApplication { public static void main(String[] args) { SpringApplication.run(SpringEurekaServerApplication.class, args); } } |
14.2.3 Eureka Server基础配置
#tomcat port server.port=8761 server.context-path=/springEurekaServer #是否将自己注册到 Eureka-Server 中,默认的为 true eureka.client.registerWithEureka=false #是否冲 Eureka-Server 中获取服务注册信息,默认为 true eureka.client.fetchRegistry=false #设置 eureka 实例名称,与配置文件的变量为主(单节点部署) eureka.instance.hostname=eureka1 |
14.2.4 配置hosts
#端口对应上面文件中的“eureka.instance.hostname”的值 127.0.0.1 eureka1 |
14.2.5 效果图
14.3 Server Provider服务搭建
14.3.1 添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> |
14.3.2 启动类上开启Eureka自动配置
@SpringBootApplication//标记这是spingBoot程序入口 @PropertySource(value={"classpath:jdbc.properties"})//tomcat启动的时候会自动将文件加载到内存中,便于后面注入数据源的时候直接从文件中取数据库链接信息 @EnableEurekaClient//开启eureka客户端服务 public class SpringProviderServerApplication { public static void main(String[] args) { SpringApplication.run(SpringProviderServerApplication.class, args); } } |
14.3.3 Eureka Provider基础配置
#tomcat port server.port=8085 server.context-path=/springProviderServer #应用程序名称,在eureka监控中显示的名称 spring.application.name=spring-provider-server #设置服务注册中心地址,指向eureka注册中心,多个注册中心的情况则用逗号隔开 #特别注意:这里有个坑,链接地址:http://eureka服务端实例名:eureka服务端端口/eureka服务端项目名/eureka,其中eureka为固定写法 eureka.client.serviceUrl.defaultZone=http://eureka1:8761/springEurekaServer/eureka/ #以IP地址注册到服务中心,相互注册使用IP地址 eureka.instance.prefer-ip-address=true #Eureka服务注册的时候实例名采用ip+port方式注册,默认是主机名+应用名+port,防止消费者调用服务接口的时候getHost拿到的是主机名而不是ip eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port} |
14.3.4 效果图
注:上面已经配置了服务端端口的hosts,这里不再重复配置
14.4 Server Consumer服务搭建
Consumer和Provider的区别就是,前者是查找服务【Consumer会去服务注册中心中查找服务】,后者是注册服务【Provider会自动将自身服务注册到服务注册中心中】,所以在配置上都是一样的。
14.4.1 添加依赖
同14.3.1 |
14.4.2 启动类上开启Eureka自动配置
同14.3.2 |
14.4.3 Eureka Consumer基础配置
#tomcat port server.port=8085 server.context-path=/springConsumerServer #应用程序名称,在eureka监控中显示的名称 spring.application.name=spring-Consumer-server #设置服务注册中心地址,指向eureka注册中心,多个注册中心的情况则用逗号隔开 #特别注意:这里有个坑,链接地址:http://eureka服务端实例名:eureka服务端端口/eureka服务端项目名/eureka,其中eureka为固定写法 eureka.client.serviceUrl.defaultZone=http://eureka1:8761/springEurekaServer/eureka/ #以IP地址注册到服务中心,相互注册使用IP地址 eureka.instance.prefer-ip-address=true #Eureka服务注册的时候实例名采用ip+port方式注册,默认是主机名+应用名+port,防止消费者调用服务接口的时候getHost拿到的是主机名而不是ip eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port} |
14.4.4 客服端通过Eureka调用服务端接口
14.4.4.1 使用ribbon负载均衡器两种方式
//方式1:使用LoadBalancerClient接口 @Service public class IxxUserServiceImpl implements IxxUserService { @Autowired private LoadBalancerClient loadBalancerClient;//ribbon负载均衡器
@Override public IxxUser getUser(Long id) { //选择调用的服务的名称,ServiceInstance 封装了服务的基本信息,如IP,端口 // 实例名=spring.application.name(应用名) ServiceInstance si = loadBalancerClient.choose("spring-provider-server"); //拼接访问服务的URL String url = "http://" + si.getHost() + ":" + si.getPort() + "/ixxUser/getUserById/" + id;
try { RestTemplate restTemplate = new RestTemplate() String response = restTemplate.getForObject(url, String.class); return JsonUtils.read(response, IxxUser.class); } catch (Exception e) { e.printStackTrace(); } return null; } } |
//方式2:使用@LoadBalanced注解 //向spring容器中注入RestTemplate-bean @Component public class RestTemplateConfiguration { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } } //客服端调用服务端接口 @Service public class IxxUserServiceImpl implements IxxUserService { @Autowired private RestTemplate restTemplate; @Override public IxxUser getUser(Long id) { try { //完整接口url=http://spring.application.name(应用名)/项目上下文/接口uri String response = restTemplate.getForObject("http://spring-provider-server/springProviderServer/ixxUser/getUserById/" + id, String.class); return JsonUtils.read(response, IxxUser.class); } catch (Exception e) { e.printStackTrace(); } return null; } } |
14.4.4.2 整合feign调用服务端接口
14.4.5 效果图
注:上面已经配置了服务端端口的hosts,这里不再重复配置
14.5 Eureka优雅停服(暂缺)
14.6 Eureka开始安全验证
安全验证是为了给Eureka服务增加一个安全校验,用户只有输入了用户名和密码后才能看到注册中心的内容
14.6.1 Eureka Server添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> |
14.6.2 Eureka Server开启安全认证配置
#开启http basic 的安全认证 security.basic.enabled=true security.user.name=minsheng security.user.password=123456 |
14.6.3 Provider/Consumer Server注册服务添加用户名和密码信息
Provider Server: eureka.client.serviceUrl.defaultZone=http://minsheng:123456@eureka1:8761/springEurekaServer/eureka/ |
Consumer Server: eureka.client.serviceUrl.defaultZone=http://minsheng:123456@eureka1:8761/springEurekaServer/eureka/ |
14.7 Eureka自我保护
14.7.1 在什么条件下,Eureka 会启动自我保护
1,自我保护的条件 一般情况下,微服务在Eureka 上注册后,会每30 秒发送心跳包,Eureka 通过心跳来 判断服务时候健康,同时会定期删除超过90 秒没有发送心跳服务。 2,有两种情况会导致Eureka Server 收不到微服务的心跳 a.是微服务自身的原因 b.是微服务与Eureka 之间的网络故障 通常(微服务的自身的故障关闭)只会导致个别服务出现故障,一般不会出现大面积故 障,而(网络故障)通常会导致Eureka Server 在短时间内无法收到大批心跳。 考虑到这个区别,Eureka 设置了一个阀值,当判断挂掉的服务的数量超过阀值时, Eureka Server 认为很大程度上出现了网络故障,将不再删除心跳过期的服务。 3,那么这个阀值是多少呢? 15 分钟之内是否低于85%; Eureka Server 在运行期间,会统计心跳失败的比例在15 分钟内是否低于85% 这种算法叫做Eureka Server 的自我保护模式。 |
14.7.2 为什么要启动自我保护
1,因为同时保留"好数据"与"坏数据"总比丢掉任何数据要更好,当网络故障恢复后, 这个Eureka 节点会退出"自我保护模式"。 2,Eureka 还有客户端缓存功能(也就是微服务的缓存功能)。即便Eureka 集群中所有节点 都宕机失效,微服务的Provider 和Consumer 都能正常通信。 3,微服务的负载均衡策略会自动剔除死亡的微服务节点。 |
14.7.3 Eureka关闭自我保护
#关闭自我保护:true 为开启自我保护,false 为关闭自我保护 eureka.server.enableSelfPreservation=false #清理间隔(单位:毫秒,默认是60*1000) eureka.server.eviction.interval-timer-in-ms=60000 |
15 Spring集成Feign组件
15.1 添加依赖
<!-- Feign依赖 --> |
15.2 开启Feign自动化配置
@SpringBootApplication//标记这是spingBoot程序入口 //tomcat启动的时候会自动将文件加载到内存中,便于后面注入数据源的时候直接从文件中取数据库信息 public static void main(String[] args) { SpringApplication.run(SpringConsumerServerApplication.class, args); } } |
15.3 客服端通过feign调用远程服务
//定义api接口 //name=spring.application.name(应用名/实例名),path=项目上下文 @FeignClient(name = "spring-provider-server",path="/springProviderServer") public interface IxxUserInterface { @GetMapping("/ixxUser/getUserById/{id}") String getUserById(@PathVariable(name = "id") Long id); } //客服端调用服务端接口 @Service public class IxxUserServiceImpl implements IxxUserService { @Autowired private IxxUserInterface ixxUserInterface; @Override public IxxUser getUser(Long id) { try { String response = ixxUserInterface.getUserById(id); return JsonUtils.read(response, IxxUser.class); } catch (Exception e) { e.printStackTrace(); } return null; } } |
自愿打赏