微服务学习笔记

仅供学习,不喜勿喷,欢迎共同交流学习。后面还会持续更新……

目录

仅供学习,不喜勿喷,欢迎共同交流学习。后面还会持续更新……

1 springBoot整合servlet两种方式

1.1 通过注解注入

1.2 通过方法注入

2 springBoot整合filter两种方式

2.1 通过注解注入

2.2 通过方法注入

3 springBoot整合listener两种方法

3.1 通过注解注入

3.2 通过方法注入

4 springBoot对静态资源的访问

4.1 springBoot从classpatch/static目录的访问

4.2 springBoot对ServletContext目录的访问

5 springBoot整合jsp

5.1 添加jsp依赖

5.2 创建全局配置文件application.properties/application.yml

6 springBoot整合freemarker

6.1 添加freemarker依赖

6.2 创建模板目录

6.3 使用HBuilder工具开发freemarker页面

7 springBoot整合Thymeleaf(重点)

7.1 添加thymeleaf依赖

7.2 创建模板目录

7.3 Thymeleaf基本用法

7.3.1 变量输出和字符串操作

7.3.2 日期格式化处理

7.3.3 条件判断

7.3.4 迭代遍历

7.3.5 域对象操作

7.3.6 URL表达式

8 springBoot整合mybatis

8.1 添加依赖      

8.2 添加jdbc文件         

8.3添加链接参数映射类

8.4 配置数据源连接  

8.5 定义mapper接口

8.5.1 Mapper接口上通过@Mapper注解扫描mapper接口

8.5.2启动类上通过@MapperScan扫描mapper接口

9    springBoot整合swagger(默认配置)

9.1 添加依赖

9.2 配置Swagger2  

9.3 添加文档类注解

9.4 效果图

10  springBoot整合swagger(引入第三方UI)

10.1 添加依赖(替换官网UI)

10.2 配置Swagger2

10.3 添加文档类注解

10.4 效果图

11  springBoot整合异常处理器  

11.1 @ControllerAdvice + @ExceptionHandler       

12  springBoot集成服务监控

12.1 不带监控界面

12.1.1 添加依赖                      

12.1.2 关闭安全校验限制

12.2 带监控界面     

12.2.1 添加依赖               

12.2.2 客服端启动类上开启监控配置

12.2.3 客服端设置服务端监控应用地址

12.2.4 健康检查参数详解

13  springBoot集成springCloud   

13.1 常见版本说明

13.2 springCloud版本说明

13.3 添加依赖        

14  springCloud集成Eureka服务   

14.1 Eureka服务三种角色

14.1.1 Eureka Server

14.1.2 服务提供方(Server Provider)

14.1.3 服务调用方(Server Consumer)

14.2 Eureka Server服务搭建

14.2.1 添加依赖

14.2.2 启动类上开启Eureka自动配置

14.2.3 Eureka Server基础配置                          

14.2.4 配置hosts 

14.2.5 效果图

14.3 Server Provider服务搭建

14.3.1 添加依赖                          

14.3.2 启动类上开启Eureka自动配置                         

14.3.3 Eureka Provider基础配置                       

14.3.4 效果图

14.4 Server Consumer服务搭建

14.4.1 添加依赖                          

14.4.2 启动类上开启Eureka自动配置                         

14.4.3 Eureka Consumer基础配置                           

14.4.4 客服端通过Eureka调用服务端接口

14.4.4.1 使用ribbon负载均衡器两种方式

14.4.4.2 整合feign调用服务端接口

14.4.5 效果图

14.5 Eureka优雅停服(暂缺)

14.6 Eureka开始安全验证

14.6.1 Eureka Server添加依赖                          

14.6.2 Eureka Server开启安全认证配置                      

14.6.3 Provider/Consumer Server注册服务添加用户名和密码信息   

14.7 Eureka自我保护

14.7.1 在什么条件下,Eureka 会启动自我保护    

14.7.2 为什么要启动自我保护 

14.7.3 Eureka关闭自我保护   

15  Spring集成Feign组件

15.1 添加依赖

15.2 开启Feign自动化配置

       15.3 客服端通过feign调用远程服务


1 springBoot整合servlet两种方式

1.1 通过注解注入

  1. 定义一个普通的servlet类继承HttpServlet,类上使用@WebServlet注解,标记当前类是一个servlet。其中name属性标记servlet名称,urlPatterns标记servlet请求路径;

        

      2.启动类上添加@ServletComponentScan,标记开启servlet/filter/listener注解扫描。

         

1.2 通过方法注入

  1. 定义一个普通的servlet类继承HttpServlet,类上不添加任何注解
  2. 启动类中自定义一个方法,方法名可任意,一般建议命名规则getXX,返回值是ServletRegistrationBean。

               

2 springBoot整合filter两种方式

2.1 通过注解注入

  1. 定义一个普通的Filter类实现Filter接口,类上使用@WebFilter注解,标记当前类是一个Filter。其中filterName标记filter名称,urlPatterns标记filter请求路径;
  2. 代码略……
  3. 启动类上添加@ServletComponentScan,标记开启servlet/filter/listener注解扫描。

2.2 通过方法注入

  1. 定义一个普通的filter类实现Filter接口,类上不添加任何注解;
  2. 启动类中自定义一个方法,方法名可任意,一般建议命名规则getXX,返回值必须是FilterRegistrationBean。

         

3 springBoot整合listener两种方法

3.1 通过注解注入

  1. 定义一个普通的Listener类实现Listener接口【具体实现哪个listener接口要看完成什么功能】,类上使用@WebFilter注解,标记当前类是一个listener;
  2. 代码略……
  3. 启动类上添加@ServletComponentScan,标记开启servlet/filter/listener注解扫描。

3.2 通过方法注入

  1. 定义一个普通的filter类实现Filter接口,类上不添加任何注解;
  2. 启动类中自定义一个方法,方法名可任意,一般建议命名规则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 变量输出和字符串操作

  1. th:text

在页面输出值,可以是字符串,也可以是el表达式。

  1. th:value

可以放在input标签中使用。eg:<inputth:value=”${msg}” />

  1. $(#strings.isEmpty(key))
  1. 判断字符串key是否为空,返回布尔值,调用的是thymeleaf内置对象
  2. 调用内置对象一定要用#,大部分的内置对象都以s结尾
  1. $(#strings.contains(key,’’))

判断字符串key是否包含指定的子串,返回布尔值

  1. $(#strings.startsWith(key,’’))

判断字符串key是否以指定子串开头,返回布尔值

  1. $(#strings.endsWith(key,’’))

判断字符串key是否以指定子串结尾,返回布尔值

  1. $(#strings.length(key))

计算字符串key长度

  1. $(#strings.indexOf(key,’’))

查找子串在字符串key中的下标,如果没找到返回-1

  1. $(#strings.substring(key,start,end))

截取字符串,包含开始不包含结束

  1. $(#strings.toUpperCase(key))

字符串转换成大写

  1. $(#strings.toLowerCase(key))

字符串转换成大写

7.3.2 日期格式化处理

  1. $(#datas.formart(key,’yyyy-mm-dd’))

格式化日期,默认编码采用浏览器编码

  1. $(#datas.year(key)

取指定日期的年份

  1. $(#datas.month(key)

取指定日期的月份

  1. $(#datas.day(key)

取指定日期的日

7.3.3 条件判断

  1. th:if

         

     2. th:switch

         

7.3.4 迭代遍历

  1. th:each

index: 当前迭代器下标

count: 当前迭代器计数器,从1开始

size:  当前迭代器长度

even: 当前迭代器是否是偶数

odd:   当前迭代器是否是奇数

first:  当前循环是否是第一条

last:当前循环是否是最后一条

7.3.5 域对象操作

7.3.6 URL表达式

基本语法:@{}

  1. 绝对路径

         

     2.相对路径(相当于项目的上下文的相对路径)

第一种写法:

         

第二种写法(同一个tomcat下不同项目的访问路径):

         

url参数传递

           

restfull风格传参:id通过地址栏传参,name通过request传参

            

8 springBoot整合mybatis

8.1 添加依赖      

<!-- springBootmybatis的支持 -->

              <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调用服务端接口

                见15Spring集成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依赖 -->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-start-feign</artifactId>
</dependency>

15.2 开启Feign自动化配置

@SpringBootApplication//标记这是spingBoot程序入口

//tomcat启动的时候会自动将文件加载到内存中,便于后面注入数据源的时候直接从文件中取数据库信息
@PropertySource(value={"classpath:jdbc.properties","classpath:settings.properties"})
@EnableEurekaClient
//开启eureka客户端服务
@EnableSwagger2//在线doc开启
@EnableFeignClients//开启feign自动化配置
public class SpringConsumerServerApplication {

       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;

       }

}

自愿打赏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿猴乐园

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值