版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaWeb开发技术与案例教程第15章JavaWeb接入DeepSeek实践第15章知识结构15.1接入准备工作•15.1.1注册开发者账号•15.1.2申请APIKey•15.1.3SpringBoot项目•15.1.4技术要点15.2案例学习:接入DeepSeek的方法•15.2.1引入依赖•15.2.2配置APIKey•15.2.3创建API处理类•15.2.4创建服务类•15.2.5创建控制器•15.2.6测试接口15.3优化与扩展•15.3.1异步调用•15.3.2异常处理•15.3.3实例:监控API调用频率15.4案例学习:将DeepSeek接入智能客服15.5本章小结1第15章课程导入
DeepSeek是杭州深度求索人工智能基础技术研究有限公司推出的人工智能助手,于2025年1月15日正式上线。DeepSeek凭借自然语言处理、机器学习与深度学习、大数据分析等核心技术优势,在推理、自然语言理解与生成、图像与视频分析、语音识别与合成等八大领域表现出色。在现代JavaWeb开发中,AI的接入已成为提升应用智能化的关键。DeepSeek提供了标准的RESTfulAPI接口,这使得基于SpringBoot架构的JavaWeb应用能够通过异步客户端(如WebClient)与其实现无缝对接。通过将DeepSeek的推理能力集成到后端服务中,开发者可以轻松实现智能客服、自动化文本生成、代码辅助分析等复杂的业务场景。本章将详细介绍如何利用SpringBoot技术栈接入DeepSeek,从API调用、数据解析到前端展示,帮助读者顺利开启AI赋能的JavaWeb开发之旅。2第15章课程导入◆本章要点•掌握接入AI大模型(DeepSeek)的基本流程:注册账号、申请APIKey并在SpringBoot中配置。•掌握使用RestTemplate或WebClient作为HTTP客户端,调用DeepSeekAPI接口。•掌握如何构建DeepSeekAPI所需的JSON请求体(DeepSeekRequest)和解析响应体(DeepSeekResponse)。•掌握使用SpringBootActuator和Micrometer依赖监控API状态。•掌握使用AOP(@Aspect,@Around)结合MeterRegistry创建自定义业务指标(如API调用频率)。3第15章课程导入◆素养目标•树立人工智能伦理意识,践行技术向善:通过DeepSeekAPI调用案例,理解“人工智能应用需符合社会主义核心价值观”。•强化数据隐私保护,防范模型滥用:在API密钥管理实践中,掌握“最小权限原则”对敏感信息保护的作用。•推动技术创新,服务社会发展:结合DeepSeek在智能客服、数据分析等领域的应用,理解“技术解决实际问题”的价值导向。•培养系统监控能力,保障服务可靠:通过API调用频率监控实践,理解“可观测性”对人工智能服务稳定性的重要性。415.1.1注册开发者账号◆访问DeepSeek官方网站。◆如图15-1所示,进入登录界面,输入手机号码,并通过验证码登录,如果输入的手机号码未注册DeepSeek,系统将自动注册。图15-1DeepSeek官网注册与登录界面515.1.1注册开发者账号◆成功登录后,将进入DeepSeek主界面,如图15-2所示。图15-2DeepSeek主界面615.1.2申请APIKey◆如图15-3所示,在主界面左边菜单中,找到APIKeys按钮并单击,将出现APIKey的创建界面。单击“创建APIKey,填写名称后单击“创建”,将获得一个APIKey。图15-3申请APIkeys界面715.1.2申请APIKey◆如图15-4所示,APIKey创建完成后,系统将弹出显示完整APIKey的界面,请将此APIKey保存在安全且易于访问的地方。出于安全原因,将无法通过APIKeys管理界面再次查看。如果丢失了这个key,将需要重新创建。另外,需要在DeepSeek中实名认证以后才能调用API。图15-4完整APIKey显示对话框815.1.2申请APIKey◆如果对DeepSeek的API使用有疑问,可以访问DeepSeek的API文档,了解接口地址、请求参数和返回格式。/zh-cn◆由于DeepSeekAPI是收费项目,因此,在调用API之前需要适量充值,具体价格请参考官网说明。915.1.3SpringBoot项目如图15-5所示,在IntelliJIDEA中,创建一个SpringBoot项目,名称为ch15,具体创建方法请参照本书13.4的内容。本书实例是在SpringBoot项目的基础上接入DeepSeek。图15-5创建SpringBoot项目1015.1.4技术要点接入API的需要关注以下技术要点:•API有调用频率限制,建议合理规划请求。•敏感操作建议使用HTTPS加密传输。•密钥请妥善保管,不要泄露。•由于版本更新较快,部分界面有所变化,请读者根据系统界面提示操作。以上技术要点可以归纳为三点:稳定性(频率限制)、安全性(HTTPS和密钥管理)和可维护性(关注版本变化)。遵守这些规范不仅能保证程序稳定运行,也是成为一名负责任开发者的体现。1115.2.1引入依赖(清单15-1pom.xml)1/2添加HTTP客户端相关依赖信息,例如RestTemplate或WebClient。完整的依赖信息如清单15-1所示。…<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--SpringBootStarterWebFlux(可选,用于WebClient)--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><!--Lombok(可选,简化代码)--><dependency><groupId>jectlombok</groupId><artifactId>lombok</artifactId><version>1.18.36</version></dependency>1215.2.1引入依赖(清单15-1pom.xml)2/2<!--SpringBootActuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--PrometheusMeterRegistry--><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><!--SpringAOP--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency></dependencies>…1315.2.2配置APIKey(清单15-2application.yml)在src/main/resources中添加application.yml配置文件,并在文件中添加清单15-2所示的代码,用于配置DeepSeek的APIKey。server:port:8080servlet:context-path:/ch15spring:application:name:ch15deepseek:api:#替换为个人在官网申请的APIKeykey:sk-********************url:/chat/completions【注意】在生产环境中,APIKey这类敏感信息不应硬编码在代码中或提交到Git仓库。推荐使用环境变量或SpringCloudConfig等方式来管理密钥。另外,API地址可能会随版本升级而变化,请以DeepSeek官方文档为准。1415.2.3创建API处理类
定义DeepSeekRequest和DeepSeekResponse两个Java类,分别用于表示DeepSeekAPI请求体和响应体。在定义请求时,关键参数是model。DeepSeekAPI的模型名称可能随官方版本更新而变化。读者运行代码前,应以DeepSeek官方API文档中的最新模型名称为准。本书示例使用deepseek-v4-flash作为默认模型,适合教学演示和普通问答场景;如需使用能力更强的模型,可将代码中的模型名称改为deepseek-v4-pro。其中,DeepSeekRequest.java是使用Lombok注解的DeepSeekAIAPI请求数据模型类,通过@Builder支持建造者模式创建对象,定义了模型名称和消息列表结构,为构建AI对话请求提供简洁的数据封装,代码如清单15-3所示。1515.2.3创建API处理类(清单15-3DeepSeekRequest.java)packagecom.example.ch15;importlombok.Builder;importlombok.Data;importjava.util.List;@Data@BuilderpublicclassDeepSeekRequest{privateStringmodel;privateList<Message>messages;@Data@BuilderpublicstaticclassMessage{privateStringrole;privateStringcontent;}}1615.2.3创建API处理类
DeepSeekResponse.java是使用Lombok注解的DeepSeekAIAPI响应数据模型类,通过嵌套的静态类定义了API返回的对话选择结构和消息内容,为解析AI对话响应提供清晰的数据结构,代码如清单15-4所示。1715.2.3创建API处理类(清单15-4DeepSeekResponse.java)packagecom.example.ch15;importlombok.Data;importjava.util.List;@DatapublicclassDeepSeekResponse{privateList<Choice>choices;@DatapublicstaticclassChoice{privateMessagemessage;@DatapublicstaticclassMessage{privateStringrole;privateStringcontent;}}}【注意】在上述类中使用了Lombok注解(@Data,@Builder),这有利于简化代码。Lombok是一个注解处理器,用于自动生成构造函数、getter/setter等模板代码。1815.2.4创建服务类
编写服务类DeepSeekService,调用DeepSeekAPI。DeepSeekService.java是用于调用DeepSeekAIAPI的服务类,通过Spring的RestTemplate发送HTTP请求,deepseek-v4-flash模型的对话生成,包含完整的请求构建、认证头设置和响应处理逻辑,为上层应用提供AI对话能力,代码如清单15-5所示。1915.2.4创建服务类(清单15-5DeepSeekService.java)1/4packagecom.example.ch15;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Service;importorg.springframework.web.client.RestTemplate;importorg.springframework.http.HttpEntity;importorg.springframework.http.HttpHeaders;importorg.springframework.http.HttpMethod;importorg.springframework.http.ResponseEntity;importjava.util.Collections;/***DeepSeekAPI调用服务类*@Service注解表示该类由Spring容器管理,作为服务层组件*提供与DeepSeekAI模型的交互能力*/@ServicepublicclassDeepSeekService{//从配置文件中注入API密钥(application.ymlorperties)@Value("${deepseek.api.key}")privateStringapiKey;//从配置文件中注入API端点地址@Value("${deepseek.api.url}")privateStringapiUrl;2015.2.4创建服务类(清单15-5DeepSeekService.java)2/4//Spring提供的HTTP客户端工具,用于发送REST请求privatefinalRestTemplaterestTemplate=newRestTemplate();/***调用DeepSeekAPI进行对话*@paramuserMessage用户输入的消息内容*@returnAI生成的回复内容*@throwsRuntimeException当API调用失败时抛出*/publicStringcallDeepSeek(StringuserMessage){//构建请求体(使用建造者模式)DeepSeekRequest.Messagemessage=DeepSeekRequest.Message.builder().role("user")//指定消息角色为用户.content(userMessage)//设置用户输入内容.build();//创建完整的请求对象DeepSeekRequestrequest=DeepSeekRequest.builder()//.model("deepseek-chat")原始模型(非思考模式).model("deepseek-reasoner")//使用思考模式,具体版本请参考官方文档.messages(Collections.singletonList(message))//包装为单消息列表.build();//配置HTTP请求头HttpHeadersheaders=newHttpHeaders();2115.2.4创建服务类(清单15-5DeepSeekService.java)3/4if(apiKey.contains("*")){System.out.println("接入失败,您没有在application.yml输入正确的ApiKey。");}headers.set("Content-Type","application/json");//指定JSON格式headers.set("Authorization","Bearer"+apiKey);//添加BearerToken认证//创建包含请求体和请求头的完整HTTP实体HttpEntity<DeepSeekRequest>entity=newHttpEntity<>(request,headers);//发送POST请求并获取响应ResponseEntity<DeepSeekResponse>response=restTemplate.exchange(apiUrl,//API端点地址HttpMethod.POST,//请求方法entity,//包含请求体和头部的实体DeepSeekResponse.class//预期响应类型);//处理响应结果if(response.getStatusCode().is2xxSuccessful()&&response.getBody()!=null){2215.2.4创建服务类(清单15-5DeepSeekService.java)4/4//从响应体中提取AI回复内容(假设响应结构包含choices列表)returnresponse.getBody().getChoices().get(0).getMessage().getContent();}else{//处理异常情况,抛出包含状态码的运行时异常thrownewRuntimeException("FailedtocallDeepSeekAPI:"+response.getStatusCode());}}}2315.2.4创建服务类
DeepSeekService是调用AI模型的业务逻辑层。它使用@Value注解从application.yml文件中自动注入apiKey和apiUrl。核心方法callDeepSeek使用RestTemplate(Spring提供的HTTP客户端)来执行API调用。它首先构建了DeepSeekRequest对象作为请求体(Body),然后创建HttpHeaders并设置Authorization头部(即APIKey)。最后,restTemplate.exchange方法以POST方式将请求发送出去,并自动将返回的JSON响应映射为DeepSeekResponse对象,通过该对象提取所需的内容并返回。【注意】DeepSeek官方可能会更新模型名称。若运行时提示模型不存在或请求失败,请优先检查代码中的model参数是否与官方API文档一致。2415.2.5创建控制器编写控制器DeepSeekController,用于暴露API给浏览器或客户端。DeepSeekController.java是基于SpringBoot的DeepSeekAI对话控制器,通过RESTfulAPI暴露聊天接口,接收用户消息参数并调用DeepSeek服务获取AI回复,为前端应用提供智能对话功能,代码如清单15-6所示。2515.2.5创建控制器(清单15-6DeepSeekController.java)packagecom.example.ch15;//导入Spring框架相关依赖importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;/***DeepSeekAPI接口控制器*@RestController表示这是一个RESTful风格的控制器,会自动将返回值序列化为JSON/XML*@RequestMapping定义控制器的基础访问路径为"/api/deepseek"*/@RestController@RequestMapping("/api/deepseek")publicclassDeepSeekController{//自动注入DeepSeek服务实例,Spring会负责创建和管理该Bean@AutowiredprivateDeepSeekServicedeepSeekService;/***处理聊天请求的GET接口*@GetMapping定义HTTPGET请求,完整路径为/api/deepseek/chat*@parammessage接收用户输入的聊天消息,通过URL参数传递(如:/chat?message=你好)*@return返回DeepSeek服务生成的对话回复*/@GetMapping("/chat")publicStringchat(@RequestParamStringmessage){//打印调试日志(生产环境建议使用日志框架)System.out.println("DeepSeekchat...SendText:"+message);//调用服务层处理聊天逻辑,并返回结果returndeepSeekService.callDeepSeek(message);}}2615.2.6测试接口运行项目中的启动类Ch15Application即可启动应用。Ch15Application.java是SpringBoot应用的主启动类,通过@SpringBootApplication注解启用自动配置和组件扫描,启动后内置Tomcat服务器并自动加载DeepSeekAI服务,用户可通过浏览器访问指定URL与AI进行对话交互,代码如清单15-7所示。2715.2.6测试接口(清单15-7Ch15Application.java)packagecom.example.ch15;importorg.springframework.boot.SpringApplication;//导入SpringBoot应用标识注解importorg.springframework.boot.autoconfigure.SpringBootApplication;/***SpringBoot应用主启动类(程序入口)*@SpringBootApplication注解包含三个核心功能:*1.@Configuration-标识该类为配置类*2.@EnableAutoConfiguration-启用自动配置机制*3.@ComponentScan-自动扫描当前包及其子包的组件*/@SpringBootApplicationpublicclassCh15Application{/***Java应用程序的主入口方法*@paramargs命令行参数*/publicstaticvoidmain(String[]args){//启动SpringBoot应用,参数说明://1.当前类作为配置源//2.传递命令行参数SpringApplication.run(Ch15Application.class,args);//应用启动后会自动://1.启动内嵌Tomcat服务器(默认端口8080)//2.执行自动配置(根据pom依赖自动配置Spring和第三方库)//3.扫描当前包及其子包的组件(@Controller,@Service等)System.out.println("DeepSeek已接入,请打开浏览器直接对话。例如输入地址:");System.out.println(":8080/ch15/api/deepseek/chat?message=请介绍一下学者网");}}2815.2.6测试接口启动SpringBoot应用后,在浏览器输入下面的地址,即可以测试接口,返回的显示结果如图15-6所示。:8080/ch15/api/deepseek/chat?message=请介绍一下学者网图15-6DeepSeek返回结果2915.3.1异步调用使用WebClient替代RestTemplate,支持异步非阻塞调用,例如清单15-8所示的代码是基于SpringWebClient的异步非阻塞DeepSeekAPI调用服务类,通过响应式编程模型实现高效的HTTP通信,配置了连接超时、读取超时和响应超时等网络参数,使用建造者模式构建请求并返回Mono<String>类型的异步响应,为高并发场景下的AI对话服务提供了优化的性能表现。3015.3.1异步调用(清单15-8DeepSeekServiceWebClient.java)1/4packagecom.example.ch15;importty.channel.ChannelOption;importty.handler.timeout.ReadTimeoutHandler;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.http.MediaType;importorg.springframework.http.client.reactive.ReactorClientHttpConnector;importorg.springframework.stereotype.Service;importorg.springframework.web.reactive.function.client.WebClient;importreactor.core.publisher.Mono;importty.http.client.HttpClient;importjava.time.Duration;importjava.util.Collections;importjava.util.List;/***DeepSeekAPI调用服务类(基于WebClient实现)*@Service表示该类由Spring容器管理,作为服务层组件*提供与DeepSeekAI模型的HTTP交互能力*/@ServicepublicclassDeepSeekServiceWebClient{//WebClient实例,用于发送HTTP请求privatefinalWebClientwebClient;3115.3.1异步调用(清单15-8DeepSeekServiceWebClient.java)2/4/***构造函数,初始化WebClient配置*@paramapiUrl从配置文件中注入的API地址(如:application.yml中的deepseek.api.url)*@paramapiKey从配置文件中注入的API密钥(如:application.yml中的deepseek.api.key)*/publicDeepSeekServiceWebClient(@Value("${deepseek.api.url}")StringapiUrl,@Value("${deepseek.api.key}")StringapiKey){//构建定制化的WebClient实例this.webClient=WebClient.builder().baseUrl(apiUrl)//设置API基础地址.defaultHeader("Authorization","Bearer"+apiKey)//添加认证头//配置底层NettyHTTP客户端.clientConnector(newReactorClientHttpConnector(HttpClient.create()//设置连接超时时间(15秒).option(ChannelOption.CONNECT_TIMEOUT_MILLIS,15000)//设置响应超时时间(20秒).responseTimeout(Duration.ofMillis(20000))//配置连接建立后的处理器.doOnConnected(conn->//添加读取超时处理器(15秒)conn.addHandlerLast(newReadTimeoutHandler(15))3215.3.1异步调用(清单15-8DeepSeekServiceWebClient.java)3/4))).build();}/***调用DeepSeekAPI进行对话*@paramuserMessage用户输入的消息内容*@returnMono<String>异步返回AI生成的回复内容*/publicMono<String>callDeepSeek(StringuserMessage){//构建请求体(使用建造者模式)DeepSeekRequest.Messagemessage=DeepSeekRequest.Message.builder().role("user")//指定消息角色为用户.content(userMessage)//设置用户输入内容.build();//创建完整的请求对象DeepSeekRequestrequest=DeepSeekRequest.builder().model("deepseek-reasoner")//指定使用的AI模型.messages(Collections.singletonList(message))//包装为单消息列表.build();//发送POST请求并处理响应returnwebClient.post().contentType(MediaType.APPLICATION_JSON)//设置请求内容类型为JSON3315.3.1异步调用(清单15-8DeepSeekServiceWebClient.java)4/4.bodyValue(request)//设置请求体.retrieve()//发送请求并获取响应.bodyToMono(DeepSeekResponse.class)//将响应体转换为DeepSeekResponse对象//从响应对象中提取AI回复内容(假设响应结构包含choices列表).map(response->response.getChoices().get(0).getMessage().getContent());}}3415.3.1异步调用(清单15-9WebMvcConfig.java)1/2同时,需要添加配置类WebMvcConfig,代码如清单15-9所示。以设置异步请求超时,否则,如果请求或者响应时间过长,将抛出异常。packagecom.example.ch15;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;/***SpringMVC异步请求配置类*@Configuration注解表示这是一个Spring配置类,用于定义Bean和配置信息*实现WebMvcConfigurer接口可以自定义SpringMVC的配置*/@ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{/***配置异步请求支持*@paramconfigurer异步支持配置器*该方法用于设置异步请求处理的默认超时时间,适用于以下场景:*1.使用@Async注解的异步方法*2.返回DeferredResult或Callable的控制器方法*3.长轮询等需要保持连接打开的请求*/3515.3.1异步调用(清单15-9WebMvcConfig.java)2/2@OverridepublicvoidconfigureAsyncSupport(AsyncSupportConfigurerconfigurer){//设置默认异步请求超时时间为60秒(单位:毫秒)//该设置可以防止长时间运行的异步请求占用服务器资源//如果未设置,默认使用服务器的超时配置(通常为10秒)configurer.setDefaultTimeout(60000);}}3615.3.1异步调用(清单15-10application.yml)或者在application.yml添加清单15-10所示配置信息,可以实现同样的效果。...spring:mvc:async:request-timeout:60000#请求超时,设置为60秒...3715.3.2异常处理添加全局异常处理类:清单15-11所示的代码是SpringBoot全局异常处理器,通过@RestControllerAdvice注解统一捕获运行时异常,返回包含500状态码和异常信息的标准化错误响应,提升了RESTAPI的异常处理能力和用户体验。3815.3.2异常处理(清单15-11GlobalExceptionHandler.java)1/2packagecom.example.ch15;importorg.springframework.http.HttpStatus;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;/***全局异常处理器(使用@RestControllerAdvice实现)*@RestControllerAdvice是以下三个注解的组合:*1.@ControllerAdvice-定义全局异常处理类*2.@ResponseBody-表示返回值直接写入HTTP响应体*3.@Component-将该类声明为Spring组件*/@RestControllerAdvicepublicclassGlobalExceptionHandler{/***处理运行时异常(RuntimeException)*@ExceptionHandler注解指定该方法处理特定类型的异常*@paramex捕获的异常对象*@returnResponseEntity包含HTTP状态码和错误信息的响应实体*当控制器抛出RuntimeException及其子类异常时:*1.返回500(INTERNAL_SERVER_ERROR)状态码*2.将异常信息作为响应内容返回3915.3.2异常处理(清单15-11GlobalExceptionHandler.java)2/2*/@ExceptionHandler(RuntimeException.class)publicResponseEntity<String>handleRuntimeException(RuntimeExceptionex){//构建包含500状态码和异常信息的响应returnResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)//设置HTTP状态码为500.body(ex.getMessage());//将异常信息作为响应体返回}}4015.3.2异常处理上述是一个全局异常处理器,通过@RestControllerAdvice注解实现。这个注解允许此类拦截所有@RestController中抛出的异常,实现了AOP思想。@ExceptionHandler(RuntimeException.class)注解指定了handleRuntimeException方法专门处理所有RuntimeException类型的异常。当DeepSeekService中调用API失败并抛出RuntimeException时,此方法会捕获它,并向客户端返回一个标准化的500(INTERNAL_SERVER_ERROR)状态码和JSON格式的错误消息,而不是直接暴露Java的堆栈跟踪信息,这是一种更健壮和安全的做法。4115.3.3实例:监控API调用频率在SpringBoot中,可以通过SpringBootActuator结合Prometheus和Grafana等工具监控API调用频率。下面实例演示了如何监控API调用频率:◆引入依赖在pom.xml中添加SpringBootActuator和Prometheus的依赖,如清单15-12所示。4215.3.3实例:监控API调用频率(清单15-12pom.xml)…<dependencies>...<!--SpringBootActuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--PrometheusMeterRegistry--><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><!--SpringAOP--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>...</dependencies>…4315.3.3实例:监控API调用频率◆参数配置在src/main/resources的application.yml配置文件中,启用Actuator的Prometheus端点,并设置相关参数,添加的配置信息如清单15-13所示。4415.3.3实例:监控API调用频率(清单15-13application.yml)management:endpoints:web:exposure:include:prometheus,health,info#暴露Prometheus端点metrics:tags:application:my-spring-boot-app#自定义标签,用于区分应用prometheus:metrics:export:step:1m#数据采集间隔,默认为1分钟4515.3.3实例:监控API调用频率(清单15-14ApiCallCounterAspect.java)1/3◆自定义API调用计数通过AOP或拦截器记录API调用频率。例如,使用AOP记录每个控制器的请求次数,代码如清单15-14所示。packagecom.example.ch15;//导入监控和AOP相关依赖importio.micrometer.core.instrument.Counter;importio.micrometer.core.instrument.MeterRegistry;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.springframework.stereotype.Component;importorg.aspectj.lang.annotation.Aspect;/***API调用计数切面(使用AOP实现监控)*@Aspect表示这是一个切面类,用于定义切入点(Pointcut)和通知(Advice)*@Component将该类声明为Spring组件,由Spring容器管理*/@Aspect@ComponentpublicclassApiCallCounterAspect{//Micrometer指标注册表,用于创建和管理监控指标privatefinalMeterRegistrymeterRegistry;/***构造函数注入MeterRegistry*@parammeterRegistry由SpringBoot自动配置的Micrometer注册表实例*/4615.3.3实例:监控API调用频率(清单15-14ApiCallCounterAspect.java)2/3publicApiCallCounterAspect(MeterRegistrymeterRegistry){this.meterRegistry=meterRegistry;}/***环绕通知:拦截指定控制器的所有方法调用*@Around定义环绕通知,拦截目标方法执行*"execution(*com.example.ch15.DeepSeekController.*(..))"表示:*-拦截com.example.ch15.DeepSeekController类中的所有方法*-*(..)匹配任意方法名和任意参数列表*/@Around("execution(*com.example.ch15.DeepSeekController.*(..))")publicObjectcountApiCalls(ProceedingJoinPointjoinPoint)throwsThrowable{//调试输出(生产环境建议使用日志框架)System.out.println("countApiCalls()");//获取被拦截方法的简短签名(如:DeepSeekController.chat())StringapiName=joinPoint.getSignature().toShortString();//创建计数器指标(如果不存在则新建)Countercounter=Counter.builder("api.calls")//指标基础名称4715.3.3实例:监控API调用频率(清单15-14ApiCallCounterAspect.java)3/3.tag("api",apiName)//添加标签区分不同API.description("API调用次数统计")//指标描述.register(meterRegistry);//注册到指标注册表counter.increment();//调用次数+1//执行被拦截的原始方法,并返回结果returnjoinPceed();}}4815.3.3实例:监控API调用频率
ApiCallCounterAspect类是AOP的一个具体应用,用于实现API调用的监控。@Aspect注解声明了这是一个切面类。@Around注解定义了一个“环绕通知”,其切点表达式execution(*com.example.ch15.DeepSeekController.*())意为“拦截DeepSeekController类中的所有方法”。当DeepSeekController的chat方法被调用时,countApiCalls方法会先执行,通过MeterRegistry找到名为api.calls的计数器并使其递增1。随后,joinPceed()会执行原始的chat方法。这样就实现了在不修改DeepSeekController源码的情况下,为其添加计数功能。4915.3.3实例:监控API调用频率◆访问Prometheus端点启动SpringBoot应用后,默认情况下Prometheus端点可以通过下面的地址访问::8080/ch15/actuator/prometheus该端点会输出类似如图15-7所示的指标数据,方框中显示的“4.0”即为API调用的次数。图15-7Prometheus指标数据5015.4案例学习:将DeepSeek接入智能客服在第14章的“微信小程序智能客服”案例中,实现了一个基于WebSocket的实时聊天应用。但其后端WebSocketService是通过一个静态名为dialogMap的HashMap来模拟AI回答的,智能化程度有限。现在已学习了如何调用DeepSeekAI大模型(DeepSeekService),可以将二者结合,打造一个真正由AI驱动的智能客服。下面将对项目14_3进行优化升级,接入DeepSeek。◆整合项目依赖首先,确保项目ch14_3(智能客服后端)项目的pom.xml中已经添加了项目ch15(DeepSeek后端)所需的依赖,特别是lombok。◆注入DeepSeekService修改项目ch14_3中的WebSocketService.java,删除WebSocketService中的静态的dialogMap,改为注入DeepSeekService,修改WebSocketService.java后的代码如清单15-15所示。5115.4案例学习:将DeepSeek接入智能客服(清单15-15WebSocketService.java)1/4packagecom.example.ch14_3.service;importcom.alibaba.fastjson.JSON;importjakarta.websocket.*;importjakarta.websocket.server.ServerEndpoint;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importjava.io.IOException;importjava.util.*;/***WebSocket服务端实现类**@ServerEndpoint注解定义WebSocket访问端点,URL模板中的{userId}可用于区分不同用户*@Component注解将该类声明为Spring组件,由Spring容器管理生命周期*/@ServerEndpoint("/imserver/{userId}")@ComponentpublicclassWebSocketService_DeepSeek{//使用线程安全的Set保存所有活跃的客户端会话(支持并发访问)privatestaticSet<Session>sessions=Collections.synchronizedSet(newHashSet<>());//声明一个静态的DeepSeekService引用privatestaticDeepSeekServicedeepSeekService;//由于WebSocket端点多例的特性,不能直接注入SpringBean,5215.4案例学习:将DeepSeek接入智能客服(清单15-15WebSocketService.java)2/4//此处采用了静态Setter注入的方法来获取DeepSeekService实例。@AutowiredpublicvoidsetDeepSeekService(DeepSeekServicedeepSeekService){WebSocketService_DeepSeek.deepSeekService=deepSeekService;}//删除静态的dialogMap/***客户端连接建立时的回调方法*@paramsession客户端会话对象*/@OnOpenpublicvoidonOpen(Sessionsession){System.out.println("新连接建立,会话ID:"+session.getId());sessions.add(session);//将新会话加入管理集合}/***接收客户端消息的回调方法*@parammessage客户端发送的JSON格式消息*@paramsessio
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-江苏-江苏水工闸门运行工一级(高级技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-江苏-江苏土建施工人员四级(中级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-新疆-新疆无损探伤工五级(初级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-新疆-新疆保安员二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-天津-天津工勤技能(公共科目)历年参考题库含答案详解3套试卷
- 肠镜检查健康指导总结
- 加压调蓄供水设施设备改造及庭院供水管道改造项目可行性研究报告模板-备案审批
- 2026年秋季开学初三学长寄语动员大会课件
- 2026年秋季开学大学一年级新生军训摄影展览活动课件
- 云南省迪庆藏族自治州香格里拉县2025-2026学年十校联考最后数学试题含解析
- 文学教育与文学类文本阅读北京大学中文系吴晓东课件
- 牛羊布病流行病学调查表
- 外科学教学课件:乳房疾病
- 塔山煤矿综合物探施工设计说明
- 2023年司法考试真题卷二答案及详解
- 2023年公务员体检表
- JJG 596-2012电子式交流电能表
- GB/T 1095-2003平键键槽的剖面尺寸
- 新生儿脐部护理技术操作考核评分标准
- 瑶药浴知识课件
- (完整版)《赤壁之战》课文讲解课件
评论
0/150
提交评论