定制网站Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用(3)

简介

先贴上

Nacos 定制网站致力于帮助您发现、定制网站配置和管理微服务。Nacos 定制网站提供了一组简单易用的特性集,定制网站帮助您快速实现动态服务发现、服务配置、定制网站服务元数据及流量管理。

Nacos 定制网站帮助您更敏捷和容易地构建、定制网站交付和管理微服务平台。 Nacos 是构建以“服务”定制网站为中心的现代应用架构 (定制网站例如微服务范式、范式) 定制网站的服务基础设施。

这里,定制网站我们先使用 nacos 定制网站作为服务的来使用,先测试负载调用,暂时不作为 配置中心。后面我们一点点的来做集成。

Nacos 服务启动

我这边使用的版本是:nacos-server-1.3.2,大家可以根据自己的需要去下载不同的版本。

运行的服务器是自己搭建的虚拟机:centos7

nacos 项目是一个基于 spring 做的项目,我们进入conf 文件目录中去,可以看到:

 上面有配置文件 application.properties,以及集群的文件 cluster.conf.example,mysql 的建表语句等 nacos-mysql.sql 等。

启动服务

我们这里就使用单节点启动,不做过多的配置,先熟悉下怎么使用,以及怎么进行程序集成。

  1. // 启动服务
  2. sh startup.sh -m standalone
  3. // 停止服务
  4. sh shutdown.sh

访问

用户名和密码都是:nacos

工程集成 Nacos

video 模块

依赖引入

  1. <!--添加nacos客户端-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>

配置文件

  1. server:
  2. port: 8000
  3. spring:
  4. application:
  5. name: demo-video
  6. datasource:
  7. driver-class-name: com.mysql.cj.jdbc.Driver
  8. url: jdbc:mysql://192.168.152.129:3306/cloud_video?useUnicode=true&characterEncoding=utf-8&useSSL=false
  9. username: admin
  10. password: 123456
  11. # 增加服务发现地址
  12. cloud:
  13. nacos:
  14. discovery:
  15. server-addr: 192.168.152.129:8848
  16. # 控制台输出sql、下划线转驼峰
  17. mybatis:
  18. configuration:
  19. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  20. map-underscore-to-camel-case: true

 启动类增加注解 @EnableDiscoveryClient

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @MapperScan("com.demo.mapper")
  4. public class VideoApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(VideoApplication.class, args);
  7. }
  8. }

尝试启动

控制台可以看到有对应的日志输出

 我们访问 nacos 控制台,就可以看到对应的服务已经注册上去了

警告处理 

控制台上面存在警告,我们这里处理下:

WARN 6384 --- [           main] c.n.c.sources.URLConfigurationSource     : No URLs will be polled as dynamic configuration sources.

我们只需要创建一个 config.properties 文件就可以了,里面的内容可以为空

 然后,我们再次启动,就没有警告信息了:

启动多个 video 服务

在测试负载调用之前,我们先多启动几个 video 服务,先修改配置文件的端口,然后在复制一个对应的启动服务:

 复制多个服务:

 然后点击确认,启动对应的服务:

 我们以同样的方式再次启动一个的服务:

 我们在nacos 后台就可以看到对应的服务集群了:

 负载均衡调用

这里是需要整合 Ribbon 与 Feign 来实现负载调用。

order 模块

 

pom 文件增加依赖

  1. <!--添加nacos客户端-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>

application.yml 增加 nacos 的配置

  1. server:
  2. port: 9000
  3. spring:
  4. application:
  5. name: demo-order
  6. datasource:
  7. driver-class-name: com.mysql.cj.jdbc.Driver
  8. url: jdbc:mysql://192.168.152.129:3306/cloud_video?useUnicode=true&characterEncoding=utf-8&useSSL=false
  9. username: admin
  10. password: 123456
  11. ## 增加 nacos 服务发现地址
  12. cloud:
  13. nacos:
  14. discovery:
  15. server-addr: 192.168.152.129:8848
  16. # 控制台输出sql、下划线转驼峰
  17. mybatis:
  18. configuration:
  19. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  20. map-underscore-to-camel-case: true

启动类增加注解

  1. @EnableDiscoveryClient
  2. @SpringBootApplication
  3. public class OrderApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(OrderApplication.class, args);
  6. }
  7. }

RestTemplateConfig 增加配置文件

  1. @Configuration
  2. public class RestTemplateConfig {
  3. @Bean
  4. @LoadBalanced
  5. public RestTemplate getRestTemplate(){
  6. return new RestTemplate();
  7. }
  8. }

OrderController 增加对外提供服务访问,以及负载调用的方式

  1. @RestController
  2. @RequestMapping("api/v1/video_order")
  3. public class OrderController {
  4. @Autowired
  5. private RestTemplate restTemplate;
  6. @RequestMapping("/save")
  7. public Object save(int videoId) {
  8. // 使用 负载均衡策略
  9. // 这里通过服务名去调用,这里的服务名就是在 nacos 上面的服务名称
  10. Video video = restTemplate.getForObject("http://demo-video/api/v1/video/find_by_id?videoId=" + videoId, Video.class);
  11. VideoOrder videoOrder = new VideoOrder();
  12. videoOrder.setVideoId(video.getId());
  13. videoOrder.setVideoTitle(video.getTitle());
  14. videoOrder.setCreateTime(new Date());
  15. videoOrder.setServerInfo(video.getServerInfo());
  16. return videoOrder;
  17. }
  18. }

启动 Order 服务

 nacos 控制台

 测试

localhost:9000/api/v1/video_order/save?videoId=30

 这个可以多访问几次,可以看到是返回的服务器地址是不一样的。

使用 Fiegn 接口实现调用

增加对应的服务类

 Order 模块中引入依赖

  1. <!-- 增加 openFeign依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>

VideoService 增加内容

这里就是使用 Feign 接口来实现调用吗,这里的好处是与真实的调用解耦,看过DDD 之后,明白说使用 Feign 接口来作为 “防腐层”。

  1. @FeignClient(name = "demo-video") // 这里需要填写的就是相应的服务名
  2. public interface VideoService {
  3. @GetMapping(value = "/api/v1/video/find_by_id")
  4. Video findById(@RequestParam("videoId") int videoId);
  5. // 这里使用 @RequestMapping 与 @PostMapping 注解都是可以的
  6. @RequestMapping(value = "/api/v1/video/saveByFeign")
  7. int saveByFeign(@RequestBody() Video video);
  8. }

OrderController 中增加对应的访问接口

  1. @Autowired
  2. private VideoService videoService;
  3. @RequestMapping("/findById")
  4. public Object findById(int videoId) {
  5. Video video = videoService.findById(videoId);
  6. VideoOrder videoOrder = new VideoOrder();
  7. videoOrder.setVideoId(video.getId());
  8. videoOrder.setVideoTitle(video.getTitle());
  9. videoOrder.setCreateTime(new Date());
  10. videoOrder.setServerInfo(video.getServerInfo());
  11. return videoOrder;
  12. }

启动类中增加注解 @EnableFeignClients

  1. @EnableDiscoveryClient
  2. @SpringBootApplication
  3. @EnableFeignClients
  4. public class OrderApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(OrderApplication.class, args);
  7. }
  8. }

启动服务测试访问

http://localhost:9000/api/v1/video_order/findById?videoId=30

最后,到这里就算集成完了。对于不同的服务模块,如果是需要通过 nacos 负载访问的是,是都需要注册到 nacos 服务端中。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发