Sspring Cloud 项目搭建

165 阅读3分钟

spring cloud 项目搭建

  • 服务注册与发现(Eureka Server, Eureka Discovery Client)
  • 服务间调用(OpenFeign)
  • 网关(Gateway)
  • 数据库访问(Mybatis, MariaDB)

本文所用的环境: JDK17, Gradle 7.6, Spring boot 3.0.2, MariaDB 11.0。

所有项目或模块的初始化直接用 IDEA 自带的 Spring Initalizr(start.spring.io) 创建。

服务注册与发现(Eureka Server, Eureka Discovery Client)

注册中心(Eureka Server)项目直接用 Spring Initalizr 创建,只添加 Eureka Server 就可以了。

我用的是 Gradle 管理依赖,默认生成的依赖不用修改。

使用 yml 配置文件,创建完毕后删除 application.properties 文件,新建 application.yml 文件,并配置内容。

#application.yml
server:
  port: 8000

spring:
  application:
    name: eureka

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      #defaultZone: http://localhost:8000/eureka/  #直接写具体的值也可以

在主类上面添加@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

这样就可以直接运行了,访问 http://localhost:8000/ 可以查看服务页面。

然后再创建一个 web 服务注册到注册中心,创建项目或模块勾选 Spring Web 和 Eureka Discovery Client 依赖,修改配置文件。

#application.yml
server:
  port: 8001

spring:
  application:
    name: web

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8000/eureka/

启动项目,两边都可以看到服务注册成功的信息,也可以访问注册中心页面查看。

服务间调用(OpenFeign)

新建一个 user-service 服务供 web 调用,选 Spring Web, OpenFeign, Eureka Discovery Client 依赖,同样注册到注册中心。

这里的 OpenFeign 依赖其实给 web 加上就好了,加上为了方便拷贝。


server:
  port: 8002

spring:
  application:
    name: user-service

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8000/eureka/

在 user-service 服务里创建一个可访问的接口。

@Controller
public class UserController {

    @GetMapping("/userInfo")
    @ResponseBody
    public String userInfo(){
        return "夜色无边";
    }
}

启动服务确保注册到注册中心,并且接口可以正常访问。

接下来给 web 项目添加 OpenFeign 依赖。

implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

web 项目创建一个 Interface,声明需要调用的服务和地址,同时也创建一个接口来调用它

//------UserApi.java-----------
//这里的名称就是服务名
@FeignClient("user-service")
public interface UserApi {
	//接口地址
    @GetMapping("/userInfo")
    @ResponseBody
    String userInfo();
}


//----TestController.java-------------
@Controller
@RequestMapping("/test")
public class TestController {

    @Resource
    public UserApi userApi;

    @GetMapping("/user")
    @ResponseBody
    public String userInfo(){

        return userApi.userInfo();
    }
}

主类添加@EnableFeignClients注解标明位置

@SpringBootApplication()
@EnableFeignClients({"com.yswb.demo"})
public class WebApplication {

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

}

重新启动 web 服务,访问 http://127.0.0.1:8001/test/user 验证是否成功。

这里只是快速验证配置是否正确,实际开发时每个服务的 @FeignClient 接口可以独立出一个模块,其它服务需要调用时只需引入即可。

网关(Gateway)

创建 gateway 服务,添加 Eureka Discovery Client, Gateway 依赖,编写配置文件。

server:
  port: 80

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8000/eureka

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: user_route
          #uri: http://127.0.0.1:8002 #直接写路径
          uri: lb://user-service #写服务名称,可负载均衡,需要配合服务发现
          predicates:
            #- Method=GET,POST
            - Path=/user/*
          filters:
            #- PrefixPath=/mypath #添加前缀
            - StripPrefix=1 #/去除一个前缀
        - id: web_route
          uri: lb://web
          predicates:
            - Path=/test/*

启动项目即可通过网关访问两个服务,/user 开头的地址分配给 user-service 服务,/test 开头的分配给 web 服务

数据库访问(Mybatis, MariaDB)

这里用 user-service 服务来验证,添加 MyBatis Framework, MariaDB Driver 依赖,Mysql 同理。

	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0'
	runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
	implementation 'javax.persistence:javax.persistence-api:2.2' //jpa 注解依赖

配置文件添加数据源和 MyBatis 配置,注意 url 字符串和 driver-class-name 是否需要更换为其它类型的数据库

spring:
  application:
    name: user-service
  datasource:
    url: jdbc:mariadb://127.0.0.1:3306/xxx
    username: root
    password: xxx
    driver-class-name: org.mariadb.jdbc.Driver

 mybatis:
  #xml文件的位置,这里是放在 resources/mapper/ 里面
  mapper-locations: classpath:/mapper/*.xml

创建一个 user 表用于测试,entity, Mapper, xml 用工具或插件生成即可。

Mapper 接口类上面需要标注 @Mapper, 如果包没在 Spring 扫描路径,主类上可以用 @MapperScans@MapperScan指定位置。