美文网首页
微服务 Spring Cloud Alibaba 项目搭建(四、

微服务 Spring Cloud Alibaba 项目搭建(四、

作者: 一介书生独醉江湖 | 来源:发表于2023-07-23 19:19 被阅读0次

一、安装Nacos

1、Nacos下载地址

官网:https://github.com/alibaba/Nacos/releases

百度云盘(tar.gz):链接: https://pan.baidu.com/s/1xI8rOgvCX37oiZT7oHYZ7A  密码: btvq


linux 下载: latest stable release
windows下载 : latest stable release

image.png

2、解压并进入nacos的bin目录

    2.1、解压

        正常情况下下载会自动解压,如未解压,可用命令:tar -zxvf nacos-server-1.2.1.tar.gz

    2.2、进入nacos的bin目录
      dsMacBook-Pro:alibaba ds$ cd /usr/local/
      dsMacBook-Pro:alibaba ds$ sudo mkdir alibaba
      dsMacBook-Pro:alibaba ds$ sudo chmod 777 /usr/local/alibaba
      dsMacBook-Pro:alibaba ds$ mv /Users/ds/Downloads/nacos /usr/local/alibaba/
      dsMacBook-Pro:alibaba ds$ cd nacos/bin/
      # 进入到nacos的bin目录
      dsMacBook-Pro:bin ds$ ls
      shutdown.cmd shutdown.sh  startup.cmd  startup.sh                

3、启动单机 + 关闭nacos

# 启动单机
dsMacBook-Pro:bin ds$ sh startup.sh -m standalone

/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/bin/java -Djava.ext.dirs=/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/lib/ext  -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xloggc:/usr/local/alibaba/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/usr/local/alibaba/nacos/plugins,/usr/local/alibaba/nacos/plugins/health,/usr/local/alibaba/nacos/plugins/cmdb,/usr/local/alibaba/nacos/plugins/selector -Dnacos.home=/usr/local/alibaba/nacos -jar /usr/local/alibaba/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/usr/local/alibaba/nacos/conf/ --logging.config=/usr/local/alibaba/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /usr/local/alibaba/nacos/logs/start.out

# 关闭nacos
dsMacBook-Pro:bin ds$ sh shutdown.sh
The nacosServer(13369) is running...
Send shutdown request to nacosServer(13369) OK

4、检查nacos启动的端口

dsMacBook-Pro:logs ds$ lsof -i:8848
COMMAND   PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    13369 ds  277u  IPv6 0x45392a576f7f5777      0t0  TCP *:8848 (LISTEN)

5、访问nacos的服务端

    5.1、访问地址:http://127.0.0.1:8848/nacos/index.html
image.png

6、验证服务器

    6.1、服务注册

dsMacBook-Pro:bin ds$ curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

    6.2、服务发现

dsMacBook-Pro:bin ds$ curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

{"name":"DEFAULT_GROUP@@nacos.naming.serviceName","groupName":"DEFAULT_GROUP","clusters":"","cacheMillis":10000,"hosts":[],"lastRefTime":1689242213419,"checksum":"","allIPs":false,"reachProtectionThreshold":false,"valid":true}
image.png

7、新建命名空间

image.png
image.png

二、engine 业务处理子模块创建

1、右键项目 - New - Module

image.png

2.1、bootstrap.yml

server:
  port: 8001    # 端口
  servlet:
    # server.servlet.context-path    1)不配置时,默认为 / , 例:localhost:8080/xxx ,2)配置时 /demo  localhost:8080/demo/xxx
    context-path:
  tomcat:
    uri-encoding: utf-8     # 编码格式 utf-8
spring:
  application:
    name: engine   #唯一名称
  profiles:
    active: dev           # 运行环境
  freemarker:
    check-template-location: false  # 检查模板位置是否存在
    prefer-file-system-access: false # 加载模板时首选文件系统访问权限。文件系统访问允许对模板更改进行热检测
mybatis:
  mapper-locations: classpath:mapping/*/*.xml
logging: # logback 配置
  path: /usr/local/alibaba/logs/${spring.application.name}   # 保存日志文件目录路径
  level: # 日志级别
    org.springframework.web: DEBUG # 配置spring web日志级别

2.2、bootstrap-dev.yml

spring:
  cloud:
    nacos:
      discovery:
        # 这里配你的本地IP
        server-addr: 192.168.0.119:8848                  # nacos的访问地址,根据上面准备工作中启动的实例配置
        namespace: 11ba48cc-9931-4760-bf58-7d3e2c99629c   # Nacos dev命名空间的ID # Nacos命名空间ID
      config:
        server-addr: 192.168.0.119:8848                  # nacos的访问地址,根据上面准备工作中启动的实例配置
        namespace: 11ba48cc-9931-4760-bf58-7d3e2c99629c   # Nacos dev命名空间的ID # Nacos命名空间ID
        group: DEFAULT_GROUP                              # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
        file-extension: yml                               # 默认properties

3、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.aydan</groupId>
        <artifactId>ali-cloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>engine</artifactId>
    <packaging>jar</packaging>

    <name>engine</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--集成公共模块-->
        <dependency>
            <groupId>com.aydan</groupId>
            <artifactId>common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!--nacos service discovery client依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--nacos config client 依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--spring cloud+dubbo 依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

        <!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

4、创建配置

image.png
image.png
image.png

5、engine-dev.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://*.*.*.*:3306/sa_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    username: root
    password: deepchain@20190115
    druid:
      initialSize: 100
      minIdle: 100
      maxActive: 300
      maxWait: 50000
  redis:
    database:
    host: *.*.*.*
    port: 6379
    password: *********
    timeout: 5000
    
dubbo:
  consumer:
    timeout: 36000
  scan:
    # dubbo 服务扫描基准包
    base-packages: com.aydan
  protocol:
    # dubbo 协议
    name: dubbo
    # 配置本机内网地址
    host: 127.0.0.1
    # dubbo 协议端口( -1 表示自增端口,从 20880 开始)
    port: -1
    dubbo:
      # 当dubbo服务提供层向消费层传输大数据容量的对象时,会受到Dubbo的限制。默认为8M,修改为800M
      payload: 838860800
  registry:
    # 挂载到 Spring Cloud 的注册中心
    address: spring-cloud://localhost

rocketmq:
  name-server: 192.168.0.119:9876
  producer:
    # 小坑:必须指定group
    group: ali-group
# common 模块中的代码
package com.aydan.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringUtils implements ApplicationContextAware {

    /**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;

    /**
     * 获取applicationContext
     *
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * 通过name获取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

6、EngineApplication.java

package com.aydan;

import com.aydan.utils.SpringUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

import javax.annotation.PostConstruct;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.TimeZone;

/**
 * @Author ds
 * @Date 2023/7/24
 */
@SpringBootApplication
@EnableDiscoveryClient
public class EngineApplication {

    public static void main(String[] args) {
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
        // SpringApplication.run(MasterApplication.class, args);
        ConfigurableApplicationContext application = SpringApplication.run(EngineApplication.class, args);
        Environment environment = application.getEnvironment();
        String applicationName = environment.getProperty("spring.application.name");
        String port = environment.getProperty("server.port");
        String contextPath = environment.getProperty("server.servlet.context-path");
        System.out.println("---------------------------------------------------------->");
        System.out.println(" :: ServletInitializer 启动:" + applicationName);
        String localHost;
        try {
            localHost = InetAddress.getLocalHost().getHostAddress();
            System.out.println("\t\t http://" + localHost + ":" + port + "" + contextPath + "");
        } catch (UnknownHostException e) {
            System.out.println("\t\t " + e.getMessage());
            e.printStackTrace();
        }
        System.out.println("<----------------------------------------------------------");
    }


    @PostConstruct
    void setDefaultTimezone() {
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
    }

    @Bean
    public SpringUtils springUtils() {
        return new SpringUtils();
    }

}
# common 模块中的代码 (可忽略)
package com.aydan.business.service;

public interface CfgService {

    String getEnvironment();

    /**
     * 取配置信息
     *
     * @param pkey
     * @return
     */
    String getValue(String pkey);

    /**
     * 返回系统临时目录
     * @return
     */
    String getTmpDir();
    
}

7、CfgServiceImpl.java (可忽略)

/**
 * @title CfgServiceImpl
 * @description
 */
package com.aydan.service.impl;


import com.aydan.business.dao.PlCfgDao;
import com.aydan.business.entity.PlCfgEntity;
import com.aydan.business.service.CfgService;
import com.aydan.utils.ValidateUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @author ds
 * @version V1.0
 * @description
 */
@DubboService
public class CfgServiceImpl implements CfgService {
    private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 当前环境
     */
    @Value("${spring.profiles.active}")
    private String environment;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    protected PlCfgDao plCfgDao;

    /**
     * 取当前环境
     *
     * @return
     */
    public String getEnvironment() {
        return environment;
    }

    /**
     * 取配置信息
     * 配置信息将通过redis进行缓存,有效期24小时
     *
     * @param pkey
     * @return
     */
    public String getValue(String pkey) {
        String key = "cfg_" + environment + "_" + pkey;
        String val = "";
        // 生产环境对值进行24小时缓存,其他环境不缓存
        if (environment.equals("prd")) {
            val = stringRedisTemplate.opsForValue().get(key);
        }
        // 如果未通过redis取得配置信息
        if (ValidateUtils.isNull(val)) {
            // 取某一环境类型下某一 key 对应的值
            PlCfgEntity cfgEntity = plCfgDao.getCfgEntity(pkey, environment);
            if (cfgEntity == null) {
                logger.error("取配置信息出错,未到到{}环境中的{}的值", environment, pkey);
            } else {
                val = cfgEntity.getPvalue();
                logger.info("pkey : " + pkey);
                logger.info("key : " + key);
                logger.info("val : " + val);
                try {
                    stringRedisTemplate.opsForValue().set(key, val, 3600 * 24, TimeUnit.SECONDS); //有效期24小时
                } catch (Exception e) {
                    logger.error("将值保存到Redis中出错(key={}, val={}):" + e.getMessage(), key, val);
                }
            }
        }
        return val;
    }

    /**
     * 返回系统临时目录
     *
     * @return
     */
    @Override
    public String getTmpDir() {
        return getValue("pl_tmp_dir");
    }

}

image.png

相关文章

网友评论

      本文标题:微服务 Spring Cloud Alibaba 项目搭建(四、

      本文链接:https://www.haomeiwen.com/subject/ktjpudtx.html