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@
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);
}
}
下一篇:SpringCloud-11-搭建Eureka Server 集群
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123818.html