SpringCloud基本模块分配搭建以及负载均衡

springcloud是基于springboot的一套微服务的解决方案,springboot可以快速构建单个应用服务,而springcloud没有重复造轮子而是将现有的技术(服务发现,负载均衡等)整合到一起提供一套分布式服务解决方案。

整体的项目结构

以上是整个项目的结构块

父类gradle.build引入

buildscript {
    ext {
        springBootVersion = '1.5.10.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'org.springframework.boot'

    group = 'com.rk.ytl'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = 1.8

    repositories {
        mavenLocal()
        mavenCentral()
    }


    ext {
        springCloudVersion = 'Edgware.SR3'
    }

    dependencies {
        compile('org.springframework.boot:spring-boot-starter-web')
        compile('org.springframework.cloud:spring-cloud-starter')
//        compile('org.springframework.cloud:spring-cloud-starter-eureka')
//        compile('org.springframework.cloud:spring-cloud-starter-eureka-server')
        runtime('org.springframework.boot:spring-boot-devtools')
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }

    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
        }
    }
}
View Code

首先创建注册中心register-center注册中心,这里注册中心就不多做介绍了。注册中心的启动类

package com.rk.ytl.register;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author 杨天乐
 * @date 2018/3/29 9:59
 */
@SpringBootApplication
@EnableEurekaServer
public class RegisterCenterApplication {

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

建立注册中心的配置(application)

spring:
  application:
    name: register-center
server:
  port: 8000
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka
    fetch-registry: false
    register-with-eureka: false
View Code

这里fetch-registry,register-with-eureka必须指定为false,表名是一个注册中心

注册中心gradle.build 引入

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-eureka-server')
}

注册中心就完成了。

创建业务接口和数据接口,这里就不做过多的讲解了。

service-api:

package com.rk.ytl.api;

import com.rk.ytl.dto.StudentDTO;
import com.rk.ytl.vo.StudentVO;

import java.util.List;

/**
 * @author 杨天乐
 * @date 2018/3/29 10:18
 */
public interface IStudentService {

    List<StudentDTO> selectAll();

    Integer LoadBalancedPortTest();
}
View Code
package com.rk.ytl.dto;

import java.sql.Date;
import java.util.Objects;

/**
 * @author 杨天乐
 * @date 2018/3/29 10:04
 */
public class StudentDTO {
    private Integer id;
    private String stuName;
    private Integer age;
    private String time;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}
View Code
package com.rk.ytl.vo;

import java.sql.Date;
import java.util.Objects;

/**
 * @author 杨天乐
 * @date 2018/3/29 10:04
 */
public class StudentVO {
    private Integer id;
    private String stuName;
    private Integer age;
    private String time;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}
View Code

project-dao:

package com.rk.ytl.dao.entity;

import org.apache.ibatis.type.Alias;

/**
 * @author 杨天乐
 * @date 2018/3/29 10:04
 */
@Alias("StudentEntity")
public class StudentEntity {
    private Integer id;
    private String stuName;
    private Integer age;
    private String time;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}
View Code
package com.rk.ytl.dao.mapper;

import com.rk.ytl.dao.entity.StudentEntity;

import java.util.List;

/**
 * @author 杨天乐
 * @date 2018/3/29 10:08
 */
public interface StudentMapper {

    List<StudentEntity> selectAll();
}
View Code

project-dao的gradle.build,引入mybatis和springboot的集成jar,已经mysql的jar

dependencies {
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.40'
    compile group: 'org.mybatis.spring.boot', name: 'mybatis-spring-boot-starter', version: '1.3.2'
}
View Code

接下来创建Student-service业务模块

build里引入project-dao,service-api的依赖

dependencies {
    compile project(':project-dao')
    compile project(':service-api')
    compile('org.springframework.cloud:spring-cloud-starter-eureka-server')
}
View Code

编写mybatis配置文件,application-local也是如下只是server.port端口不同(用于测试负载均衡)

spring:
  application:
    name: Student-service
  datasource:
    url: jdbc:mysql://localhost:3306/myschool?characterEncoding=utf-8&useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root
server:
  port: 8001
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka
mybatis:
  type-aliases-package: com.rk.ytl.dao.entity
  mapper-locations: mappers/*.xml
View Code

mappers文件下的studentMapper.xml对应project-dao接口的方法并实现

创建Student-service启动类

package com.ytl.student;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author 杨天乐
 * @date 2018/3/29 10:17
 */
@SpringBootApplication
@EnableEurekaServer
@MapperScan("com.rk.ytl.dao.mapper")
public class StudentServiceApplication {

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

@MapperScan("")对应扫描project-dao的mapper包

创建service包,新建实现业务类

package com.ytl.student.service;

import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.rk.ytl.api.IStudentService;
import com.rk.ytl.dao.entity.StudentEntity;
import com.rk.ytl.dao.mapper.StudentMapper;
import com.rk.ytl.dto.StudentDTO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Nullable;
import java.util.List;

/**
 * @author 杨天乐
 * @date 2018/3/29 10:18
 */
@RestController
@Service
public class StudentServiceImpl implements IStudentService {

    @Autowired
    private StudentMapper studentMapper;

    @GetMapping("/selectAll")
    @Override
    public List<StudentDTO> selectAll() {
        return Lists.transform(studentMapper.selectAll(), new Function<StudentEntity, StudentDTO>() {
            @Nullable
            @Override
            public StudentDTO apply(@Nullable StudentEntity input) {
                StudentDTO studentDTO = new StudentDTO();
                BeanUtils.copyProperties(input,studentDTO);
                return studentDTO;
            }
        });
    }

    @Value("${server.port}")
    private Integer port;

    @RequestMapping("/test")
    @Override
    public Integer LoadBalancedPortTest() {
        return port;
    }
}
View Code

最后一个Student-Client用于测试负载均衡

application.yml配置就是最基本的配置发现服务中心

spring:
  application:
    name: Student-Client
server:
  port: 8080
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka
View Code

Student-Client创建启动类

@LoadBalanced是关键,不加,不能实现负载均衡

package com.rk.ytl;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author 杨天乐
 * @date 2018/3/29 10:39
 */
@SpringBootApplication
@EnableDiscoveryClient
public class StudentClientApplication {

    @Bean
    @LoadBalanced
    RestTemplate template(){
        return new RestTemplate();
    }

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

创建controller用于测试

package com.rk.ytl.controller;

import com.rk.ytl.dto.StudentDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author 杨天乐
 * @date 2018/3/29 10:40
 */
@RestController
public class TestController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/test")
    public Integer test(){
        return restTemplate.getForObject("http://STUDENT-SERVICE/test",Integer.class);
    }
}
View Code

url一定要对应业务名称

gradle.build引入eureka的客户端

dependencies {
    compile project(':service-api')
    compile('org.springframework.cloud:spring-cloud-starter-eureka')
}
View Code

一直访问localhost:8080/test就能看见端口在切换,实现了负载均衡。

学到希望大家给个赞,多评论,谢谢!

原文地址:https://www.cnblogs.com/yangtianle/p/8669015.html