目录

1、首先建一个springboot项目(idea)

1.1、修改pom.xml

2、新增公共子模块

 2.1、添加依赖

2.2、建立一些公共对象

3、建立商品模块

3.1、修改pom.xml

3.2、 配置数据源

 3.3、基本操作单表的类

3.4、设置主启动类

 4、建立订单模块

4.1、pom.xml

 4.2、设置数据源

4.3、设置启动类

5、添加注册中心

5.1、nacos

5.2、eureka

6、负载均衡


1、首先建一个springboot项目(idea)

不用选择任何依赖直接next

1.1、修改pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    #版本管理需修改为pom打包
    <packaging>pom</packaging>
    #子模块
    <modules>
        <module>qy151-gzh-springcloud-order</module>
        <module>qy151-gzh-springcloud-common</module>
        <module>qy151-gzh-springcloud-goods</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/>
    </parent>

    <groupId>com.gzh</groupId>
    <artifactId>myspringcloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    #版本管理
    <properties>
        <project.bulid.sourceEncoding>UTF-8</project.bulid.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
             <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2、新增公共子模块

选择以maven项目创建即可

 2.1、添加依赖

其他子模块可以共用公共模块的依赖不需再添加依赖了

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.20</version>
    </dependency>
      #数据库驱动
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.3</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
    </dependency>
     <!--mybatis-plus 生成器-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.31</version>
    </dependency>
     <dependency>
         <groupId>com.baomidou</groupId>
         <artifactId>mybatis-plus-boot-starter</artifactId>
         <version>3.5.2</version>
    </dependency>
    #数据库连接池
   <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.11</version>
   </dependency>
</dependencies>

2.2、建立一些公共对象

 CommonResult

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult {
   private Integer status; //200成功  201失败
    private String  msg;    //提示信息
    private Object  data;   //服务器返回值数据

    public static CommonResult fail(){

        return new CommonResult(201,"业务调用失败!!",null);
    }

    public static CommonResult fail(int code, String msg){
        return new CommonResult(code, msg, null);
    }

    public static CommonResult success(){

        return new CommonResult(200,"业务调用成功!!",null);
    }


    public static CommonResult success(Object data){

        return new CommonResult(200,"业务调用成功!!",data);
    }

    public static CommonResult success(String msg, Object data){

        return new CommonResult(200,msg,data);
    }
}

ShopOrder

@Data
@Builder
@TableName("shop_order")
public class ShopOrder implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 订单id
     */
    @TableId(value = "oid", type = IdType.ASSIGN_ID)
    private Long oid;

    /**
     * 用户id
     */
    private Integer uid;

    /**
     * 用户名
     */
    private String username;

    /**
     * 商品id
     */
    private Long pid;

    /**
     * 商品名称
     */
    private String pname;

    /**
     * 商品价格
     */
    private BigDecimal pprice;

    /**
     * 购买数量
     */
    private Integer number;
}

ShopProduct 

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("shop_product")
public class ShopProduct implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 商品id
     */
    @TableId(value = "pid", type = IdType.AUTO)
    private Long pid;

    /**
     * 商品名
     */
    private String pname;

    /**
     * 商品价格
     */
    private BigDecimal pprice;

    /**
     * 商品库存
     */
    private String stock;

}

3、建立商品模块

3.1、修改pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>myspringcloud</artifactId>
        <groupId>com.gzh</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>qy151-gzh-springcloud-goods</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        #引用common模块
        <dependency>
            <groupId>com.gzh</groupId>
            <artifactId>qy151-gzh-springcloud-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

3.2、 配置数据源

#服务端口号
server.port=8082

spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
spring.datasource.druid.username=
spring.datasource.druid.password=

#启动mysql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

 3.3、基本操作单表的类

IShopProductService

public interface IShopProductService extends IService<ShopProduct> {

}

ShopProductServiceImpl

@Service
public class ShopProductServiceImpl extends ServiceImpl<ShopProductMapper, ShopProduct> implements IShopProductService {

}

 ShopProductMapper

public interface ShopProductMapper extends BaseMapper<ShopProduct> {

}

ShopProductController 

@RestController
@RequestMapping("/good")
public class ShopProductController {

   @Autowired
   IShopProductService iShopProductService;

   @GetMapping("/selectone/{gid}")
   public CommonResult selectOne(@PathVariable String gid){
     ShopProduct shopProduct = iShopProductService.getById(gid);

     return shopProduct != null ? CommonResult.success("success", shopProduct) : CommonResult.success("没有这条数据", null);
   }
}

3.4、设置主启动类

@SpringBootApplication
@MapperScan(basePackages = "com.gzh.mapper")//设置持久层扫描
public class SpringGoodApplication {
   public static void main(String[] args) {
      org.springframework.boot.SpringApplication.run(SpringGoodApplication.class, args);
   }
}

 

 4、建立订单模块

4.1、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>myspringcloud</artifactId>
        <groupId>com.gzh</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>qy151-gzh-springcloud-order</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.gzh</groupId>
            <artifactId>qy151-gzh-springcloud-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

 4.2、设置数据源

与上面一致

4.3、设置启动类

@SpringBootApplication
@MapperScan(basePackages = "com.gzh.mapper")
public class SpringOrderApplication {
   public static void main(String[] args) {
      org.springframework.boot.SpringApplication.run(SpringOrderApplication.class, args);
   }
   
   @Bean//spring提供模块之间通信的类 需要手动注入
   public RestTemplate restTemplate(){
      return new RestTemplate();
   }
}

 4.4、简单调用商品模块的接口进行下单

其他的mapper,service....与上面一样继承BaseMapper即可

@RestController
@RequestMapping("/order")
public class ShopOrderController {

   @Autowired
   RestTemplate restTemplate;

   @Autowired
   IShopOrderService shopOrderService;

   @PostMapping("/{gid}/{count}")
   @LoadBalanced
   public CommonResult pay(@PathVariable String gid,@PathVariable Integer count){
       
      CommonResult commonResult = restTemplate.getForObject("http://localhost:8081/good/selectone/"+gid, CommonResult.class);
//jackson包下的一个将object对象转为相应的java对象
      ShopProduct shopProduct = new ObjectMapper().convertValue(commonResult.getData(), ShopProduct.class);

      ShopOrder order = ShopOrder.builder().pname(shopProduct.getPname())
                                  .pprice(shopProduct.getPprice())
                                  .username("wd")
                                  .pid(shopProduct.getPid())
                                  .number(count)
                                  .uid(1).build();
        //存入数据库中
      boolean save = shopOrderService.save(order);
      return save ? CommonResult.success("添加成功", null) : CommonResult.success("添加失败", null);
   }

} 

这样就完成了基本的微服务架构

5、添加注册中心

5.1、nacos

1、添加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、下载nacos服务器

Nacos官方文档:Nacos 快速开始

Nacos下载地址:Releases · alibaba/nacos · GitHub

编辑startup.sh,将MODE修改为standalone改为单机模式启动

然后访问http://localhost:8848/nacos/

默认帐号nacos 密码nacos

 3、注册服务

编辑order模块的application.properties 新增属性

spring.cloud.nacos.server-addr=localhost:8848#nacos地址
spring.cloud.nacos.discovery.service=springcloud-order#注册服务名

可以看到已经注册到nacos中了

5.2、eureka

1、单独建立一个eureka模块作为启动eureka服务的服务器

2、pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3、修该application.properties

server.port=7000

eureka.instance.hostname=localhost
#是否注册自己
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
#eureka访问地址
eureka.client.service-url.defaultZone=http://localhost:7001/eureka/

4、创建主启动类

@SpringBootApplication
@EnableEurekaServer//开启eureka服务
public class EurekaApp {
   public static void main(String[] args) {
      SpringApplication.run(EurekaApp.class, args);
   }
}

5、配置客户端

添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

修改application.properties

#设置服务名
eureka.instance.appname=order

eureka.client.service-url.defaultZone=http://localhost:7000/eureka/

6、启动

访问http://localhost:7000/

6、负载均衡

使用其内置的ribbon做负载均衡

在主启动类上加@EnableEurekaClient注解开启

@SpringBootApplication
@MapperScan(basePackages = "com.gzh.mapper")
@EnableEurekaClient
public class SpringOrderApplication {
   public static void main(String[] args) {
      org.springframework.boot.SpringApplication.run(SpringOrderApplication.class, args);
   }

   @Bean
   @LoadBalanced
   public RestTemplate restTemplate(){
      return new RestTemplate();
   }
}

 使用负载均衡

@RestController
@RequestMapping("/order")
public class ShopOrderController {

   @Autowired
   RestTemplate restTemplate;

   @Autowired
   IShopOrderService shopOrderService;

   @Autowired
   DiscoveryClient discoveryClient;

   @PostMapping("/{gid}/{count}")
   public CommonResult pay(@PathVariable String gid,@PathVariable Integer count){

        //会查询所有这个名字下服务 并进行轮询访问
      CommonResult commonResult = restTemplate.getForObject("http://设置服务名/good/selectone/"+gid, CommonResult.class);
       
      ShopProduct shopProduct = new ObjectMapper().convertValue(commonResult.getData(), ShopProduct.class);

      ShopOrder order = ShopOrder.builder().pname(shopProduct.getPname())
                                  .pprice(shopProduct.getPprice())
                                  .username("wd")
                                  .pid(shopProduct.getPid())
                                  .number(count)
                                  .uid(1).build();

      boolean save = shopOrderService.save(order);
      return save ? CommonResult.success("添加成功", null) : CommonResult.success("添加失败", null);
   }

}

自定义策略

#修改application.properties

springcloud-order.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
  1. 随机 (RandomRule)
  2. 轮询 (RoundRobinRule)
  3. 加权(WeightedResponseTimeRule)
  4. .........
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐