1.SpringCloud环境搭建
-
创建一个maven项目(删除src目录):父工程
-
导入相关依赖(jar包)
<!--打包方式--> <packaging>pom</packaging> <!-- <properties>--> <!-- <!–引入版本号–>--> <!-- <junit.version>4.12</junit.version>--> <!-- <lombok.version>1.18.10</lombok.version>--> <!-- <log4j.version>1.2.17</log4j.version>--> <!-- </properties>--> <dependencyManagement> <dependencies> <!--配置SpringCloud的依赖--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <!--配置SpringBoot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.4.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.21</version> </dependency> <!--SpringBoot启动器--> <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>4.12</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> </dependencyManagement>
-
在创建一个Maven项目:子工程(实体类层)
1.引入相关jar包
<!--当前的Module自己需要的依赖,如果父类依赖中配置了版主,这里就不用写了--> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
2.连接数据库(mysql)
3.创建实体类:Dept
package com.ddf.springcloud.pojo; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; //实体类需要序例化 @Data @NoArgsConstructor @Accessors(chain = true) //链式写法 public class Dept implements Serializable { //Dept实体类, orm 类表关系映射 private Long deptno; //主键 private String dname; //这个数据库存在哪个数据库的字段 微服务,一个服务对应一个数据库,同一个信息可能存在不同的数据库 private String db_source; public Dept(String dname) { this.dname = dname; } /* * 链式写法 * Depet dept = new Dept(); * dept.setDeptNo(11).setDname('ssss').setDb.source('001') * * */ }
-
在创建一个Maven项目:子工程(供应者)
1.引入相关jar包
<dependencies> <!--我们需要拿到实体类,所有要配置api module--> <dependency> <groupId>org.example</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--引用父类的jar包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!--test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--jetty--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <!--热部署工具,可以不用频繁的重启项目--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies>
2.创建application.yml文件,配置相关的配置
server: port: 8001 #mybatis配置 mybatis: type-aliases-package: com.ddf.springcloud.pojo configuration-properties: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mapper/*.xml #spring的配置 spring: application: name: springcloud-provider-dept datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/db01?userUnicode=true&characterEncoding=UTF-8 username: root password: 123
3.创建对应的mybatis和mapper文件目录,配置mybatis-config.xml文件
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>
DeptDao.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.ddf.springcloud.dao.DeptDao"> <insert id="addDept" parameterType="Dept"> insert into dept(dname,db_source) values(#{dname},DATABASE()); </insert> <select id="findById" resultType="Dept" parameterType="Long"> select * from dept where deptno = #{deptno} </select> <select id="findAll" resultType="Dept"> select * from dept; </select> </mapper>
4.创建dao接口类:DeptDao
package com.ddf.springcloud.dao; import com.ddf.springcloud.pojo.Dept; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; import java.util.List; @Mapper @Repository public interface DeptDao { //添加 public boolean addDept(Dept dept); //通过id查询 public Dept findById(Long id); //查询所有 public List<Dept> findAll(); }
5.创建service层:DeptService和DeptServiceImpl
package com.ddf.springcloud.service; import com.ddf.springcloud.pojo.Dept; import java.util.List; public interface DeptService { //添加 public boolean addDept(Dept dept); //通过id查询 public Dept findById(Long id); //查询所有 public List<Dept> findAll(); }
package com.ddf.springcloud.service; import com.ddf.springcloud.dao.DeptDao; import com.ddf.springcloud.pojo.Dept; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class DeptServiceImpl implements DeptService { @Autowired private DeptDao deptDao; public boolean addDept(Dept dept) { return deptDao.addDept(dept); } public Dept findById(Long id) { return deptDao.findById(id); } public List<Dept> findAll() { return deptDao.findAll(); } }
6.创建controller层:DeptController
package com.ddf.springcloud.controller; import com.ddf.springcloud.pojo.Dept; import com.ddf.springcloud.service.DeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; //提供Restful服务 @RestController public class DeptController { @Autowired private DeptService deptService; @PostMapping("/dept/add") public boolean addDept(Dept dept){ return deptService.addDept(dept); } @GetMapping("/dept/get/{id}") public Dept getDept(@PathVariable Long id){ return deptService.findById(id); } @GetMapping("/dept/list") public List<Dept> findAll(){ return deptService.findAll(); } }
7.创建测试类,测试项目是否能够正常运行
package com.ddf.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; //设置启动类 @SpringBootApplication public class DeptProvider_8001 { public static void main(String[] args) { SpringApplication.run(DeptProvider_8001.class,args); } }
-
在创建一个Maven项目(子项目)消费者
1.引入相关需要的jar包
<!--引入实体类+web--> <dependencies> <dependency> <groupId>org.example</groupId> <artifactId>springcloud-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> </dependencies>
2.创建application.yml文件配置端口号
server: port: 80
3.创建Controller层:DeptConsumerController
package com.ddf.springcloud.controller; import com.ddf.springcloud.pojo.Dept; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class DeptConsumerController { //理解:消费者,应该有service层 //RestTemplate 供我们直接调用就可以了,注册到Spring中 @Autowired private RestTemplate restTemplate; //通过restTemplate去获取服务端的对应方法 //定义服务端请求路径 private static final String REST_URL_PREFIX="http://localhost:8001"; @GetMapping("/comsumer/dept/add") public Boolean add(Dept dept){ //(url,实体:map,class<T> responseType) //url:请求路径 //实体:参数 //responseType:请求的类型 return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add",dept,Boolean.class); } @GetMapping("/comsumer/dept/get/{id}") public Dept get(@PathVariable Long id){ return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id,Dept.class); } @GetMapping("/comsumer/dept/list") public List<Dept> list(){ return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list",List.class); } }
4.创建config层:configBean(注入RestTemplate供我们使用)
package com.ddf.springcloud.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; //@Configuration类似于我们之前用spring的application.xml文件 @Configuration public class configBean { @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
5.创建测试类,看是否能够访问到8001端口(先启动8001在启动80端口)
package com.ddf.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; //设置启动类 @SpringBootApplication public class DeptProvider_8001 { public static void main(String[] args) { SpringApplication.run(DeptProvider_8001.class,args); } }
8001端口访问:http://localhost:8001/dept/get/1
80端口访问:http://localhost/comsumer/dept/get/1;就可以访问到8001端口的数据
2.配置Eureka
-
在创建一个子项目
-
引入相关jar包
<!--导包--> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.6.RELEASE</version> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies>
-
配置application.yml文件
server: port: 7001 #配置Eureka eureka: instance: hostname: localhost #Eureka服务器的实例名称 client: register-with-eureka: false #表示是否想eureka注册中心注册自己 fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心 service-url: #监控页面 defaultZon: http://${eureka.instance.hostname}:${server.port}/eureka/
-
创建测试类
package com.ddf.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer //EnableEurekaServer 服务端的启动类,可以接受别人注册进来 public class EurekaServer_7001 { public static void main(String[] args) { SpringApplication.run(EurekaServer_7001.class, args); } }
😋访问:http://localhost:7001/;就能进入到Eureka的页面
-
注意事项
在这里需要降一下springboot的版本,要不然会报错:把它降到Springboot2.1.6就好了
3.把Eureka配置到8001端口中
-
导入相关jar
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.6.RELEASE</version> </dependency>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8EjgErTl-1604756922767)(C:\Users\11111\AppData\Roaming\Typora\typora-user-images\image-20201021212352457.png)]
-
在8001项目中的application.yml配置Eureka
#eureka的配置 eureka: client: service-url: defaultZone: http://localhost:7001/eureka/
-
在测试类中开启Eureka
package com.ddf.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; //设置启动类 @SpringBootApplication @EnableEurekaClient //在服务启动后自动注册到Eureka中,开启Eureka的连接 public class DeptProvider_8001 { public static void main(String[] args) { SpringApplication.run(DeptProvider_8001.class,args); } }
先启动7001项目然后在启动8001项目,然后访问:http://localhost:7001/我们就可以看到我们注册的8001端口号
-
完善Eureka的监控信息
- 在8001项目引入jar包
<!--actuator完善监控信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
- 在8001项目中的application.yml配置Eureka
#eureka的配置 eureka: client: service-url: defaultZone: http://localhost:7001/eureka/ instance: instance-id: springcloud-provider-dept8001 #修改eureka上的Status #配置Status的信息 info: app.name: ddf-springcloud company.name: blog.ddf.com
然后访问:http://localhost:7001/;点击Status下的路径,我们就可以看到我们配置的信息
-
Eureka自我保护机制
出现这个就是Eureka自我保护机制,说明某个端口号出现了问题断开了连接,需要重新开启才可以连接
-
注入DiscoveryClient实现服务注册与发现
1.在8001项目DeptController注入DiscoveryClient
package com.ddf.springcloud.controller; import com.ddf.springcloud.pojo.Dept; import com.ddf.springcloud.service.DeptService; 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.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; //提供Restful服务 @RestController public class DeptController { @Autowired private DeptService deptService; //获取一些配置的信息,得到具体的微服务 @Autowired private DiscoveryClient client; @PostMapping("/dept/add") public boolean addDept(Dept dept){ return deptService.addDept(dept); } @GetMapping("/dept/get/{id}") public Dept getDept(@PathVariable Long id){ return deptService.findById(id); } @GetMapping("/dept/list") public List<Dept> findAll(){ return deptService.findAll(); } //通过注册进来的微服务,去获取一些消息 @GetMapping("/dept/discovery") public Object discovery(){ //获取微服务列表的清单 List<String> services = client.getServices(); System.out.println("获取到了微服务的信息:" + services); //得到一个具体的微服务新,通过具体的微服务id,application List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT"); //打印出相关信息 for(ServiceInstance instance : instances){ System.out.println(instance.getHost()); System.out.println(instance.getPort()); System.out.println(instance.getUri()); System.out.println(instance.getServiceId()); } return this.client; } }
- 在启动类中添加@EnableDiscoveryClient注解
package com.ddf.springcloud; 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; //设置启动类 @SpringBootApplication @EnableEurekaClient //在服务启动后自动注册到Eureka中,开启Eureka的连接 @EnableDiscoveryClient //服务发现 public class DeptProvider_8001 { public static void main(String[] args) { SpringApplication.run(DeptProvider_8001.class,args); } }
- 运行8001项目:访问http://localhost:8001/dept/discovery,就会得到这个信息