Spring Cloud搭建

本文详细介绍了一个基于 Spring Cloud 的微服务架构实战案例,包括 Maven 项目的搭建、依赖管理、实体类定义、服务提供者与消费者的实现、Eureka 服务注册与发现等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建个主项目maven

pom.xml导入依赖

<!-- 依赖版本 -->
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <druid.version>1.2.5</druid.version>
        <mysql.version>5.1.49</mysql.version>
        <junit.version>4.12</junit.version>
        <lombok.version>1.16.10</lombok.version>
        <log4j.version>1.2.17</log4j.version>
        <logback.version>1.2.3</logback.version>
    </properties>

   <!-- 总项目,依赖管理 -->
    <dependencyManagement>
        <dependencies>
            <!-- spring cloud 依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- spring boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- 连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <!-- mysql -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!-- junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <!-- lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <!-- log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>${logback.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

创建公共模块cloud-api

在这里插入图片描述
pom.xml导入依赖

<dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

创建测试实体

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain=true)
public class User implements Serializable {

    private String id;

    private String name;

    private String sex;

    private Date birthday;
}

创建服务提供方(生产者)

在这里插入图片描述
pom.xml导入依赖

<dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
    </dependencies>

application.yml

spring:
  application:
    name: provider-8000
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db03?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456

# mybatis 配置
mybatis:
  type-aliases-package: com.wxk.api.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/UserMapper.xml

server:
  port: 8000

mybatis文件
在这里插入图片描述
mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

实体mybatis.xml —— UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wxk.provider.dao.UserDao">

    <insert id="addUser" parameterType="User">
        insert into user (id,name,sex,birthday)
        values (uuid(),#{name},#{sex},#{birthday})
    </insert>

    <select id="queryByName" parameterType="string" resultType="User">
        select * from user where name = #{name}
    </select>
</mapper>

UserDao.java

@Mapper
@Repository
public interface UserDao {

    void addUser(User User);

    User queryByName(String name);
}

UserService.java

public interface UserService {

    void addUser(User user);

    User queryByName(String name);
}

UserServiceImpl.java

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public void addUser(User user) {
        userDao.addUser(user);
    }

    @Override
    public User queryByName(String name) {
        return userDao.queryByName(name);
    }
}

UserController.java

@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("addUser")
    public String addUser(){
        User user = new User();
        user.setName("wxk").setSex("男").setBirthday(new Date());
        userService.addUser(user);
        return "成功";
    }

    @GetMapping("queryByName")
    public User queryByName(String name){
        User user = userService.queryByName(name);
        return user;
    }
}

启动类

@SpringBootApplication
public class Provider8000 {

    public static void main(String[] args) {
        SpringApplication.run(Provider8000.class,args);
    }
}

创建服务调用方(消费者)

在这里插入图片描述
pom.xml

<dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

application.yml

server:
  port: 80

BeanConfig.java 加入RestTemplate bean对象

@Configuration
public class BeanConfig {

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

ConsumeController.java

@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    private static final String URL = "http://localhost:8000/user/";

    @RequestMapping("queryByName")
    public User queryByName(String name){
        User user = restTemplate.getForObject(URL + "queryByName?name="+name, User.class);
        return user;
    }
}

启动类

@SpringBootApplication
public class Consumer80 {

    public static void main(String[] args) {
        SpringApplication.run(Consumer80.class,args);
    }
}

Euraka 服务注册中心,用于定位服务,监控服务

在这里插入图片描述
pom.xml依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

application.yml

server:
  port: 7000

eureka:
  instance:
    hostname: localhost # 服务实例
  client:
    register-with-eureka: false #是否要在eureka注册中心注册,自己本身不用注册
    fetch-registry: false #false 表示自己时注册中心
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

启动类

@SpringBootApplication
@EnableEurekaServer
public class Eureka7000 {

    public static void main(String[] args) {
        SpringApplication.run(Eureka7000.class,args);
    }
}

访问地址:http://localhost:7000/

服务注册,在服务提供方上加配置

在上面项目cloud-provider-8000 pom.xml加入依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.7.RELEASE</version>
</dependency>
eureka:
  instance:
    instance-id: provider8000 # eureka界面的服务描述
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:7000/eureka/  #服务注册中心地址

在启动类加入注解@EnableEurekaClient
在这里插入图片描述

Feign声明式的web service客户端

公共模块cloud-api添加feign依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.7.RELEASE</version>
</dependency>

添加调用接口
UserFeignClient
在这里插入图片描述

@FeignClient(value = "PROVIDER-8000")//eureka服务名
public interface UserFeignClient {
    @GetMapping("user/queryByName/{name}")//服务url
    public User queryByName(@PathVariable("name") String name);
}

创建feign调用客户端项目

在这里插入图片描述
引入依赖pom.xml

	<dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <!-- ribbon -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!-- Eureka -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

application.yml

server:
  port: 9000

#eureka ribbon 配置
eureka:
  client:
    register-with-eureka: false #不向eureka中注册自己
    service-url:
      defaultZone: http://127.0.0.1:7000/eureka/

启动类FeignClient9000

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.wxk.cloud"})
public class FeignClient9000 {
    public static void main(String[] args) {
        SpringApplication.run(FeignClient9000.class,args);
    }
}

服务调用controller

@RestController
@RequestMapping("feign")
public class FeignController {
    @Autowired
    private UserFeignClient userFeignClient;
    @GetMapping("queryByName/{name}")
    public User queryByName(@PathVariable("name") String name){
        return userFeignClient.queryByName(name);
    }
}

后续继续更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值