SpringCloud-10-Eureka:注册服务提供者服务

32 篇文章 1 订阅
5 篇文章 0 订阅
5.5 注册服务提供者服务
  • 基于基础工程中的服务提供者Module,在服务提供者microservice-cloud-provider-dept-8001包的pom.xml 中补充引入eureka的相关以下依赖
<!--引入 Eureka Client 的依赖,将服务注册到 Eureka Server-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Spring Boot 监控模块,完善监控信息-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • 在microservice-cloud-provider-dept-8001包的类路径(/resources 目录)下的配置文件 application.yml,补充eureka配置内容如下。
#eureka配置,Spring cloud 自定义服务名称和 ip 地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/
  instance:
    instance-id: microservice-provider-8001 #自定义服务名称信息
    prefer-ip-address: true           #显示访问路径的 ip 地址
	#zookeeper需要配置那些服务service被扫描,eureka则是将整个服务包注册进去了
	
# spring cloud 使用 Spring Boot actuator 监控完善信息
# Spring Boot 2.50对 actuator 监控屏蔽了大多数的节点,只暴露了 heath 节点,本段配置(*)就是为了开启所有的节点
management:
  endpoints:
    web:
      exposure:
        include: "*"  #应包含的端点 ID 或 '' 全部,* 在yaml 文件属于关键字,所以需要加引号

info:             #配置一些服务描述信息,监控信息页面显示,,可以判断服务是否正常
  app.name: microservice-cloud-provider-dept-8001
  company.name: cloud.zk.com
  auth: zk
  email: 123@qq.com
  build.aetifactId: @project.artifactId@
  build.version: @project.version@

  • 在 microservice-cloud-provider-dept-8001包的主启动类上,使用 @EnableEurekaClient 注解开启 Eureka 客户端功能,将服务注册到服务注册中心(Eureka Server),代码如下。
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient  //在服务启动后自动注册到eureka中
public class MicroserviceCloudProviderDept8001Application {

    public static void main(String[] args) {
        SpringApplication.run(MicroserviceCloudProviderDept8001Application.class, args);
    }

}
  • 存在问题1,如果导入的依赖名称不对,启动时则会找不到相关的类注意和spring-cloud-starter-netflix-eureka-client的区别java.lang.ClassNotFoundException:com.netflix.discovery.AbstractDiscoveryClientOptionalArgs
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-netflix-eureka-client</artifactId>
</dependency>

在这里插入图片描述

  • 存在问题2:mybatis的配置中Property ‘configuration’ and ‘configLocation’ can not specified with together,不能同时存在,否则无法实例化sqlSessionFactory bean
    在这里插入图片描述
  • 依次启动 microservice-cloud-eureka-7001 和 microservice-cloud-provider-dept-8001,使用浏览器访再次问 Eureka 服务注册中心主页(http://localhost:7001/),如下图。
    在这里插入图片描述
  • 结果显示 Instances currently registered with Eureka (注册到 Eureka Server 的实例)选项中已经包含了一条服务信息,即已经有服务注册到 Eureka Server 上了。

Instances currently registered with Eureka 选项中包含以下内容:

Application:MICROSERVICECLOUDPROVIDERDEPT,该取值为 micro-service-cloud-provider-dept-8001 配置文件 application.yml 中 spring.application.name 的取值。

Status: UP (1) - microservice-provider-dept-8001,UP 表示服务在线, (1) 表示有集群中服务的数量,microservice-provider-dept-8001 则是 microservice-cloud-provider-dept-8001 配置文件 application.yml 中 eureka.instance.instance-id 的取值。

若Status: UP (2)有两个是因为你修改了8001后热部署 又注册了一次,全部重启就好了

  • 访问microservice-provider-dept-8001在页面左下角有http://192.168.1.3:8001/actuator/info链接,前提是要在服务提供者的yml中配置prefer-ip-address: true #显示访问路径的 ip 地址
    在这里插入图片描述
#eureka配置,Spring cloud 自定义服务名称和 ip 地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/  #这个地址是 7001注册中心在 application.yml 中暴露出来额注册地址 (单机版)
  instance:
    instance-id: microservice-provider-dept-8001 #自定义服务名称描述信息
    prefer-ip-address: true           #显示访问路径的 ip 地址
    #zookeeper需要配置那些服务service被扫描,eureka则是将整个服务包注册进去了
  • 解决Eureka /actuator/info 404错误及不显示info
  • info内容的构建,若不配置info信息则这个链接http://192.168.1.3:8001/actuator/info是错误页面
    在这里插入图片描述
  • 这就是服务提供者microservice-cloud-provider-dept-8001包的pom.xml 中该依赖的作用了
<!-- Spring Boot 监控模块,完善监控给你信息-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • 在springboot2.7.2中,info端点默认不启用,在application.yml中配置的info开头的变量默认也是不启用的。这一点官方文档中也有说明。官方文档

在这里插入图片描述

  • 如何开启info呢?只需要在application.yml补充配置management.info.env.enabled: true即可,然后在自定义配置info信息即可
# spring cloud 使用 Spring Boot actuator 监控完善信息
# Spring Boot 2.50对 actuator 监控屏蔽了大多数的节点,只暴露了 heath 节点,本段配置(*)就是为了开启所有的节点
management:
  endpoints:
    web:
      exposure:
        include: health,info  #应包含的端点 ID 或 '' 全部,* 在yaml 文件属于关键字,所以需要加双引号
        #include的值也可以改成*,但建议还是最小暴露原则,用啥开启啥
  info:
    env:
      enabled: true   #启用配置里的info开头的变量


info:             #配置一些服务描述信息,监控信息页面显示,可以判断服务是否正常
  app.name: microservice-cloud-provider-dept-8001
  company.name: cloud.zk.com
  auth: zk
  email: 123@qq.com
  build.aetifactId: @project.artifactId@
  build.version: @project.version@
  • 访问http://192.168.1.3:8001/actuator/info显示,这样可以判断服务是否正常
    在这里插入图片描述
  • 完整的服务提供者包的application.yml配置文件
server:
  port: 8001
spring:
  application:
    name: microservice-cloud-provider-dept-8001 #微服务名称,对外暴漏的微服务名称,十分重要
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/springcloud_db_core?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimeZone=UTC
    type: com.alibaba.druid.pool.DruidDataSource
    #SpringBoot默认是不注入这些的,需要自己绑定
    #druid数据源专有配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true

    #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #如果允许报错,java.lang.ClassNotFoundException: org.apache.Log4j.Priority

    #则导入log4j 依赖就行
    filters: stat,wall,log4j2
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
#整合mybatis
mybatis:
  type-aliases-package: com.zk.springcloud.entity
  mapper-locations: classpath:mybatis/mapper/*.xml
  #config-location: classpath:mybatis/mybatis-config.xml
  configuration:
    map-underscore-to-camel-case: true #默认开启驼峰命名法,可以不用设置该属性

#eureka配置,Spring cloud 自定义服务名称和 ip 地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/  #这个地址是 7001注册中心在 application.yml 中暴露出来额注册地址 (单机版)
  instance:
    instance-id: microservice-provider-dept-8001 #自定义服务名称描述信息
    prefer-ip-address: true           #显示访问路径的 ip 地址
    #zookeeper需要配置那些服务service被扫描,eureka则是将整个服务包注册进去了

# spring cloud 使用 Spring Boot actuator 监控完善信息
# Spring Boot 2.50对 actuator 监控屏蔽了大多数的节点,只暴露了 heath 节点,本段配置(*)就是为了开启所有的节点
management:
  endpoints:
    web:
      exposure:
        include: health,info  #应包含的端点 ID 或 '' 全部,* 在yaml 文件属于关键字,所以需要加双引号
        #include的值也可以改成*,但建议还是最小暴露原则,用啥开启啥
  info:
    env:
      enabled: true   #启用配置里的info开头的变量


info:             #配置一些服务描述信息,监控信息页面显示,,可以判断服务是否正常
  app.name: microservice-cloud-provider-dept-8001
  company.name: cloud.zk.com
  auth: zk
  email: 123@qq.com
  build.aetifactId: @project.artifactId@
  build.version: @project.version@
5.6 服务发现DiscoveryClient
  • 对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息。【对外暴露服务】
  • 表示通常可用于发现服务(例如 Netflix Eureka 或 consul.io)的读取操作,在团队中开发需要服务的一些信息
  • 修改microservice-cloud-provider-dept-8001的DeptController使用org.springframework.cloud.client.discovery.DiscoveryClient的发现类来获得某instance-id服务的信息
package com.example.controller;

import com.example.service.DeptService;
import com.zk.springcloud.entity.Dept;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author CNCLUKZK
 * @create 2022/9/7-1:43
 */
@RestController     //提供restful服务,@RestController需要spring-boot-starter-web
@Slf4j
@RequestMapping("/dept")
public class DeptController {
    @Autowired
    private DeptService deptService;

    //获取一些配置的信息,得到具体的微假务
    @Autowired
    private DiscoveryClient discoveryClient;

    @PostMapping("/add")  //GET跟安不安全没关系的,RESTful规范问题
    public boolean addDept(@RequestBody Dept dept) {
        return deptService.addDept(dept);
    }
    @GetMapping("/get/{deptNo}")
    public Dept getDeptByID(@PathVariable("deptNo") Integer deptNo) {
        return deptService.queryDeptByID(deptNo);
    }
    @GetMapping("/list")
    public List<Dept> queryAll() {
        return deptService.queryAll();
    }

    //对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
    @RequestMapping("/discoveryServiceInfo")
    public Object discoveryServiceInfo(){
        //获取注册中心中微服务列表的清单
        List<String> services = discoveryClient.getServices();
        System.out.println("Erueka Server list information:"+services);
        List<ServiceInstance> instances = discoveryClient.getInstances("microservice-cloud-provider-dept-8001");  //spring.application.name
        for (ServiceInstance instance:instances){
            System.out.println("instance.getHost()+"+instance.getHost());
            System.out.println("instance.getInstanceId()+"+instance.getInstanceId());
            System.out.println("instance.getServiceId()+"+instance.getServiceId());
            System.out.println("instance.getPort()+"+instance.getPort());
            System.out.println("instance.getUri()+"+instance.getUri());
        }
        return instances; //可以直接返回instances,这样直接在页面显示json了

    }
}

服务发现也需要spring-boot-starter-actuator依赖来获取监控信息

  • 然后再microservice-cloud-provider-dept-8001主启动类上添加@EnableDiscoveryClient注解来进行服务发现

注意:@EnableEurekaClient和@EnableDiscoveryClient效果是一样的,如果是Eureka必须选Eureka的注解,如果是其他的注册中心选第二个

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient  //在服务启动后自动注册到eureka中
@EnableDiscoveryClient //服务发现
public class MicroserviceCloudProviderDept8001Application {

    public static void main(String[] args) {
        SpringApplication.run(MicroserviceCloudProviderDept8001Application.class, args);
    }

}
  • 然后重启提供者服务,待注册中心将服务注册进去后访问http://127.0.0.1:8001/dept/discoveryServiceInfo结果如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
下一篇:SpringCloud-11-搭建Eureka Server 集群
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值