文章目录
说明:
本案例是依靠狂神说springcloud讲解完成,对于添加部门接口在测试的时候,使用了post请求,添加未成功,其他功能没有问题。
http://localhost/consumer/dept/add?dname=%27aa%27
问题描述:在生产者方,添加接口没有问题,在消费者使用RestTemplate调用postForObject的方法,报错如下,eureka集群添加部门名称功能有问题,解决方案正在处理中。
springcloud-api的搭建
- 主要是封装实体类,添加mysql-connector-java的依赖。
- 导入依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
- java实体类
package cn.itcast.springcloud.pojo;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 类描述:
*
* @ClassName Dept
* @Description TODO
* @Author GZ
* @Date 2021/10/20 22:23
* @Version 1.0
*/
@Accessors
@NoArgsConstructor
@Data
public class Dept implements Serializable {
private long deptno;
private String dname;
private String DB_source;
public Dept(String dname) {
this.dname = dname;
}
}
springcloud-consumer-dept-80消费者的搭建
- 消费者中配备了Eurka的服务注册中心 和 Ribbon 的负载均衡
application.yaml
server:
port: 80
eureka:
client:
register-with-eureka: true #表示是否将自己注册进Eureka默认为true
fetch-registry: true #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用 负载均衡
service-url:
defaultZone: http://localhost01:7001/eureka/,http://localhost02:7002/eureka/,http://localhost03:7003/eureka/
spring:
application:
name: consumer
RestTemplateConfig
package cn.itcast.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* 类描述:
*
* @ClassName RestTemplateConfig
* @Description TODO
* @Author GZ
* @Date 2021/10/21 2:01
* @Version 1.0
*/
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced //Ribbon的负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
ConsumerDept
package cn.itcast.controller;
import cn.itcast.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
/**
* 类描述:
*
* @ClassName ConsumerDept
* @Description TODO
* @Author GZ
* @Date 2021/10/21 1:40
* @Version 1.0
*/
@RestController
public class ConsumerDept {
// private static final String PROVIDERDEPT = "http://localhost:8001";
private static final String PROVIDERDEPT ="http://SPRINGCLOUD-PROVIDER-DEPT";
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/dept/all")
public List<Dept> findAllDept() {
return restTemplate.getForObject(PROVIDERDEPT+"dept/all", List.class);
}
//测试有问题,可删除
@RequestMapping("/consumer/dept/add")
public boolean add( @RequestBody Dept dept) {
return restTemplate.postForObject(PROVIDERDEPT+"dept/add", dept, Boolean.class);
}
@GetMapping("/consumer/dept/get/{deptno}")
public Dept findById(@PathVariable("deptno") long deptno) {
return restTemplate.getForObject(PROVIDERDEPT+"/dept/get/"+deptno, Dept.class);
}
}
Consumer
package cn.itcast;
import cn.itcast.config.RestTemplateConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
/**
* 类描述:
*
* @ClassName Consumer
* @Description TODO
* @Author GZ
* @Date 2021/10/21 2:05
* @Version 1.0
*/
@SpringBootApplication
@EnableEurekaClient
//@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = RestTemplateConfig.class)
public class Consumer {
public static void main(String[] args) {
SpringApplication.run(Consumer.class,args);
}
}
springcloud-enureka-7001集群的搭建
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
EurekaServerPort7001
package cn.itcast.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* 类描述:
*
* @ClassName EurekaServer_7001
* @Description TODO
* @Author GZ
* @Date 2021/10/21 14:19
* @Version 1.0
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerPort7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServerPort7001.class,args);
}
}
application.yaml
server:
port: 7001
eureka:
instance:
hostname: localhost01 #eureka的名称
client:
fetch-registry: false #是否将自己作为erueka的注册中心
register-with-eureka: false #是否将自己注册到eureka中
service-url:
defaultZone: http://localhost02:7002/eureka/,http://localhost03:7003/eureka/
server:
# 关闭自我保护机制,保证不可用的服务被及时剔除
enable-self-preservation: false
# 如果2秒内没有收到某个微服务的心跳,那就剔除该微服务,单位为毫秒
eviction-interval-timer-in-ms: 2000
springcloud-enureka-7002集群的搭建
application.yaml
server:
port: 7002
eureka:
instance:
hostname: localhost02 #eureka的名称
client:
fetch-registry: false #是否将自己作为erueka的注册中心
register-with-eureka: false #是否将自己注册到eureka中
service-url:
defaultZone: http://localhost01:7001/eureka/,http://localhost03:7003/eureka/
server:
# 关闭自我保护机制,保证不可用的服务被及时剔除
enable-self-preservation: false
# 如果2秒内没有收到某个微服务的心跳,那就剔除该微服务,单位为毫秒
eviction-interval-timer-in-ms: 2000
- 配置文件不同,名称不同,其他与springcloud-enureka-7001完全相同
springcloud-enureka-7003集群的搭建
application.yaml
server:
port: 7003
eureka:
instance:
hostname: localhost03 #eureka的名称
client:
fetch-registry: false #是否将自己作为erueka的注册中心
register-with-eureka: false #是否将自己注册到eureka中
service-url:
defaultZone: http://localhost01:7001/eureka/,http://localhost02:7002/eureka/
server:
# 关闭自我保护机制,保证不可用的服务被及时剔除
enable-self-preservation: false
# 如果2秒内没有收到某个微服务的心跳,那就剔除该微服务,单位为毫秒
eviction-interval-timer-in-ms: 2000
- 配置文件不同,名称不同,其他与springcloud-enureka-7001完全相同
springcloud-provider-dept-8001生产者的搭建
DeptController
package cn.itcast.controller;
import cn.itcast.service.DeptService;
import cn.itcast.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 类描述:
*
* @ClassName DeptController
* @Description TODO
* @Author GZ
* @Date 2021/10/20 23:36
* @Version 1.0
*/
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
//获取一些配置的信息
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/dept/all")
public List<Dept> findAllDept() {
return deptService.findAllDept();
}
@RequestMapping("/dept/add")
public Boolean addDept(Dept dept) {
return deptService.addDept(dept);
}
@GetMapping("/dept/get/{deptno}")
public Dept findById(@PathVariable("deptno") long deptno) {
return deptService.findById(deptno);
}
// @GetMapping("dept/discover")
// public Object discover() {
// List<String> services = discoveryClient.getServices();
// System.out.println("微服务信息" + services);
//
// List<ServiceInstance> instances = discoveryClient.getInstances("springcloud-provider-dept");
// for (ServiceInstance instance : instances) {
// System.out.println(
// instance.getHost() + "\t" +
// instance.getUri() + "\t" +
// instance.getPort() + "\t" +
// instance.getServiceId()
// );
//
// }
// return discoveryClient;
// }
}
DeptMapper
package cn.itcast.mapper;
import cn.itcast.springcloud.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
/**
* 类描述:
*
* @ClassName DeptMapper
* @Description TODO
* @Author GZ
* @Date 2021/10/20 23:05
* @Version 1.0
*/
@Mapper
@Repository
public interface DeptMapper {
public List<Dept> findAllDept();
public Boolean addDept(Dept dept);
public Dept findById(long deptno);
}
DeptService
package cn.itcast.service;
import cn.itcast.springcloud.pojo.Dept;
import java.util.List;
public interface DeptService {
public List<Dept> findAllDept();
public Boolean addDept(Dept dept);
public Dept findById(long deptno);
}
DeptServiceImpl
package cn.itcast.service.impl;
import cn.itcast.mapper.DeptMapper;
import cn.itcast.service.DeptService;
import cn.itcast.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 类描述:
*
* @ClassName DeptServiceImpl
* @Description TODO
* @Author GZ
* @Date 2021/10/20 23:34
* @Version 1.0
*/
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public List<Dept> findAllDept() {
return deptMapper.findAllDept();
}
@Override
public Boolean addDept(Dept dept) {
return deptMapper.addDept(dept);
}
@Override
public Dept findById(long deptno) {
return deptMapper.findById(deptno);
}
}
Provider
package cn.itcast;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* 类描述:
*
* @ClassName provider
* @Description TODO
* @Author GZ
* @Date 2021/10/20 23:44
* @Version 1.0
*/
@SpringBootApplication
@EnableEurekaClient//将服务注入进来
//@EnableDiscoveryClient//服务发现
public class Provider {
public static void main(String[] args) {
SpringApplication.run(Provider.class,args);
}
}
DeptMapper.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="cn.itcast.mapper.DeptMapper">
<select id="findAllDept" resultType="Dept">
select * from dept
</select>
<insert id="addDept" parameterType="Dept" >
insert into dept (dname,DB_source) values (#{dname},DATABASE())
</insert>
<select id="findById" parameterType="long" resultType="dept">
select * from dept where deptno = #{deptno}
</select>
</mapper>
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>
application.yaml
server:
port: 8001
mybatis:
type-aliases-package: cn.itcast.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
spring:
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db01?useSSL=true&useUnicode=true&characterEncoding=utf8
username: root
password: 1234
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用 负载均衡
fetch-registry: true
service-url:
#注册中心地址 如果集群每个Eureka注册中心都写上用,间隔
defaultZone: http://localhost01:7001/eureka/,http://localhost02:7002/eureka/,http://localhost03:7003/eureka/
pom
<?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>springcloud-demo01</artifactId>
<groupId>cn.itcast</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-provider-dept-8001</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>cn.itcast</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- springboot的启动依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-jetty</artifactId>-->
<!-- <version>2.0.0</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
整个项目的pom文件
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcast</groupId>
<artifactId>springcloud-demo01</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>springcloud-api</module>
<module>springcloud-provider-dept-8001</module>
<module>springcloud-consumer-dept-80</module>
<module>springcloud-enureka-7001</module>
<module>springcloud-enureka-7002</module>
<module>springcloud-enureka-7003</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springcloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 数据库连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- mybatis整合springboot-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 日志技术-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!-- 日志技术-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- bean文件处理-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>