今天学习了SpringCloud的入门级项目,特意来分享一下
一 Springcloud概述
springcloud是微服务实现的方案之一,与其它微服务框架相比,可以快速的构建分布式系统 ,是一套完整的微服务解决方案;其特色不仅包括微服务框架通常有的注册中心,负载均衡,配置中心,安全框架,熔断机制,服务监控等,功能强大,易于运行。
由于暂时只学习了Eureka,所以本篇文章只讲Eureka及简单的项目实例
二 Eureka,一个基于REST服务的,服务注册与发现的组件
它主要包括两个组件 : Eureka Server和Eureka Client
Eureka Client: 一个Java客户端,用于简化Eureka Server的交互(通常就是微服务中的客户端和服务端),注册到Eureka Server上
Eureka Server: 提供服务注册和发现的能力(通常就是微服务中的注册中心),与dubbo常用的zookeeper类似
三 开始写项目
开始创建server
项目整体结构:
首先在cloud-demo项目中导入父依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Eureka Server的实现非常简单,首先我们来看导入的maven依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--Eureka的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-server</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<!--Springcloud的安全议认证-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
随后的启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
application.yml文件:
server:
port: 7776
eureka:
client:
fetch-registry: false #是否检索服务(默认为true)
register-with-eureka: false #是否启动服务注册(默认为true)
#指定服务注册中心地址,类型为 HashMap,并设置有一组默认值,默认的Key为 defaultZone;默认的Value为 http://localhost:8761/eureka ,如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。
#如果服务注册中心加入了安全验证,这里配置的地址格式为: http://<username>:<password>@localhost:8761/eureka 其中 <username> 为安全校验的用户名;<password> 为该用户的密码
service-url:
defaultZone: http://localhost:7776/eureka/
server:
enable-self-preservation: false #是否开启自我保护,Eureka 会统计15分钟之内心跳失败的比例低于85%将会触发保护机制,不剔除服务提供者,如果关闭服务注册中心将不可用的实例正确剔除
#安全机制
security:
basic:
enabled: true #是否生成随机密码
#自定义的账户密码
user:
name: root
password: root
Eureka Server就已经启动完成了,接下来我们启动类EurekaServerApplication并且访问所配置的http://localhost:7776/
即刻输入我们自定义的用户名和密码
进入这个页面就是配置成功。
接下来我们开始编写客户端
这里所使用到的是SpringBoot+Mybatis,将生产者和消费者都放在同一个模块中,如下图:
首先新建一个cloud-user模块在cloud-demo下(创建模块的步骤就不多讲了)
cloud-user的maven依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--这里我们将putg实体类新建了一个模块放在cloud-demo下,下面的依赖小伙伴们使用自己的-->
<dependency>
<groupId>com.jbit.springcloud</groupId>
<artifactId>cloud-entity</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
开始编写提供者:
启动类:
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan(basePackages = "com.jbit.mapper") //自己dao的映射位置
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
Mapper:
import java.util.List;
public interface UserMapper {
List<User> selectAll();
}
Service:
import java.util.List;
public interface UserService {
List<User> selectAll();
}
ServiceImpl:
import com.jbit.mapper.UserMapper;
import com.jbit.service.User;
import com.jbit.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Service
@RestController
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@RequestMapping(value = "selectAll",method = RequestMethod.GET)
@Override
public List<User> selectAll() {
System.out.println("selectAll");
return userMapper.selectAll();
}
Mapper映射 :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.jbit.mapper.UserMapper">
<select id="selectAll" resultType="User">
select user_name as userName,password as password from user;
</select>
</mapper>
application.yml:
server:
port: 8081
spring:
application:
name: user-provider
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springcloud?useUnicode=true&characterEncoding=utf-8&useSSL=false
password: root
username: root
mybatis:
type-aliases-package: com.jbit.entity
mapper-locations: classes:com.jbit.mapper/*.xml
eureka:
client:
service-url:
defaultZone: http://root:root@localhost:7776/eureka/ #因为Eureka方是设置的自定义的账户密码,所以这边就要设置相同的
注意扫描的包名与自己的相同
消费者:
消费者的结构大致与提供者相同,启动类:
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@SpringBootApplication
@MapperScan(basePackages = "com.jbit.mapper")
@EnableDiscoveryClient
@EnableFeignClients //使用Feign
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
Service:
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@FeignClient(name = "user-provider") //生产者名称
public interface UserService {
//服务名称
@RequestMapping(value = "selectAll")
public List<User> selectAll();
}
Mapper:
import com.jbit.service.User;
import java.util.List;
public interface UserMapper {
List<User> selectAll();
}
Mapper映射:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.jbit.mapper.UserMapper">
<select id="selectAll" resultType="User">
select user_name as userName,password as password from user;
</select>
</mapper>
Controller:
import com.jbit.service.User;
import com.jbit.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/selectAll")
public List<User> selectAll(){
return userService.selectAll();
}
}
application.yml:
server:
port: 8080
spring:
application:
name: user-consumer
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springcloud?useUnicode=true&characterEncoding=utf-8&useSSL=false
password: root
username: root
mybatis:
type-aliases-package: com.jbit.entity
mapper-locations: classes:com.jbit.mapper/*.xml
eureka:
client:
service-url:
defaultZone: http://root:root@localhost:7776/eureka/
配置好了以后我们依次启动cloud-eureka里面的EurekaServerApplication—>cloud-provider里面的UserApplication—>cloud-consumer里面的UserApplication
注意启动过程中必须得三个类依次加载完,如果没有加载完就启动下一个会出现报错以及访问的时候出现找不到提供者
启动成功以后访问http://localhost:8080/user/selectAll
记录一下有一个坑,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
这个依赖只能放到所需要的项目里面,如若放到父项目里面,然后子项目引用的话会造成你访问http://localhost:8080开头的网址就弹出登录框
项目github地址:https://github.com/HB-java/springcloud-demo