SpringCloud及中间件项目框架配置整合

SpringCloud微服务集成环境

技术选型:

  • 服务注册和服务发现:Nacos
  • 服务调用:Feign
  • 统一网关:Gateway
  • 消息中间件:RabbitMQ
  • 数据库:MySQL
  • 中间件及部署:Docker
  • SpringBoot+MyBatis再次不多赘述

模块关系:

  • feign-api:feign抽取后的模块,进行解耦合
  • feign-service:服务消费者
  • gateway:统一网关
  • user-service:服务生产者
内容介绍:
依赖介绍:

父工程指定了SpringCloud,SpringCloudAlibaba等依赖版本,子工程依赖各自导入

<!--依赖版本管理-->
<dependencyManagement>
    <!--SpringCloud管理依赖版本-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!--SpringBoot管理依赖版本-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!--SpringCloudAlibaba管理依赖版本-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Nacos:

由于在父工程指定了版本,子模块不再指定版本,需要注册的服务都需要进行这一步

  1. 引入依赖

    <!--Nacos依赖-->
    <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  2. 编写配置文件

    # 端口配置
    server:
      port: 8081
    # 数据库配置
    spring:
      # mysql数据库配置
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=true&serverTimezone=UTC
        username: root
        password: ssx14233
      application:
        name: userservice # 服务名称
      cloud:
        nacos:
          server-addr: localhost:8848 # Nacos服务地址
    
  3. 编写配置类,添加注解

    @EnableDiscoveryClient
    @Configuration
    public class NacosDiscoveryConfiguration {
    }
    

Feign:

服务间的调用使用Feign

  1. 引入依赖

    <!--Feign依赖-->
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 在启动类添加自动装配注解

    @EnableFeignClients
    @SpringBootApplication
    public class UserServiceApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(UserServiceApplication.class, args);
        }
        
    }
    
  3. 写服务提供者,注意使用Restful风格

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @GetMapping("/getUser/{id}")
        public User getUserById(@PathVariable("id") Long id) {
            return new User(id, "Feign", "Use Feign");
        }
    
    }
    
  4. 编写client接口

    @GetMapping("/user/getUser/{id}")
    User getUser(@PathVariable("id") Long id);
    
  5. 注意,这里使用的是feign-api,对feign进行了抽取,解耦合
    feign-api

Gateway

  1. 引入依赖

       <!--Nacos依赖-->
       <dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
       </dependency>
    
       <!--gateway依赖-->
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-gateway</artifactId>
       </dependency>
    
  2. 编写配置文件

    # 端口配置
    server:
      port: 10001
    # 数据库配置
    spring:
      # mysql数据库配置
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=true&serverTimezone=UTC
        username: root
        password: ssx14233
    
      application:
        name: gateway # 服务名称
      cloud:
        nacos:
          server-addr: localhost:8848 # Nacos服务地址
        gateway:
          routes: # 网关路由配置
            - id: user-service # 路由表示,必须唯一
              uri: lb://userservice # 路由的目标地址,lb是负载均衡
              predicates: # 路由断言,判断请求是否符合规则
                - Path=/user/**
            - id: feign-service
              uri: lb://feignservice
              predicates:
                - Path=/feign/**
    
    
  3. 因为统一网关也需要在Nacos注册,编写配置类

    @EnableDiscoveryClient
    @Configuration
    public class NacosDiscoveryConfiguration {
    }
    
    

RabbitMQ

引入依赖

<!--AMQP依赖,包含RabbitMQ-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

<!--发送消息序列化-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

编写配置文件,此处联合上面的Nacos

spring:
  # mysql数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=true&serverTimezone=UTC
    username: root
    password: ssx14233
  application:
    name: userservice # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos服务地址
  rabbitmq: # rabbitmq配置
    host: 127.0.0.1 # ip地址
    port: 5672 # 端口
    virtual-host: / # 虚拟主机
    username: guest
    password: guest
消息发送
  1. 消息提供者使用了controller调用service发送消息,请求controller即可发送消息
    controller代码
    @GetMapping("/sendMessageToRabbitmq/{id}")
    public void sendMessageToRabbitmq(@PathVariable Long id) {
        userService.sendMessageToRabbitmq(new User(id, "RabbitMQ", "Use RabbitMQ"));
    }
    
    service代码
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Override
        public void sendMessageToRabbitmq(User user) {
            // 交换机名称
            String exchangeName = "user.topic";
            // 发送消息
            rabbitTemplate.convertAndSend(exchangeName, "user.insert", user);
        }
    
    }
    
消息接收
  1. 声明队列在消费者这方,当接收到了消息就执行service中的代码,通过@RabbitListener声明队列

    @Component
    public class UserListener {
    
        @Autowired
        private UserService userService;
    
        @RabbitListener(bindings = @QueueBinding(
                value = @Queue(name = "user.insert.queue"),
                exchange = @Exchange(name = "user.topic", type = ExchangeTypes.TOPIC),
                key = "#.insert"
        ))
        public void listenSaveUser(@RequestBody User user) {
            userService.saveUser(user);
        }
    
    }
    

    service代码

    @Override
        public void saveUser(User user) {
            System.out.println("通过RabbitMQ调用,插入对象\n" + user);
        }
    

Docker&RabbitMQ

安装docker

此处以作者的CentOS7.6为例

  1. 安装依赖

    yum -y install gcc
    
    yum -y install gcc-c++
    
  2. 安装

    yum install docker
    
  3. 启动docker服务

    service docker start
    
安装RabbitMQ
  1. 查询RabbitMQ镜像
    docker search rabbitmq:management
    
  2. 拉取镜像
    docker pull rabbitmq:3-management
    
  3. 创建并启动rabbitmq容器
    docker run \
     -e RABBITMQ_DEFAULT_USER=guest\
     -e RABBITMQ_DEFAULT_PASS=guest \
     --name mq \
     -p 15672:15672 \
     -p 5672:5672 \
     -d \
     rabbitmq:3-management
    

如果是阿里云服务器,可以在阿里云控制台进行端口开放

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值