Springcloud微服务操作<一>
一:微服务简介(Microservice)
微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务。这些小的Web服务可以独立地编译及部署,并通过各自暴露的API接口相互通讯。它们彼此相互协作,作为一个整体为用户提供功能,却可以独立地进行扩。
微服务架构需要的功能或使用场景:
1:我们把整个系统根据业务拆分成几个子系统。
2:每个子系统可以部署多个应用,多个应用之间使用负载均衡。
3:需要一个服务注册中心,所有的服务都在注册中心注册,负载均衡也是通过在注册中心注册的服务来使用一定策略来实现。
4:所有的客户端都通过同一个网关地址访问后台的服务,通过路由配置,网关来判断一个URL请求由哪个服务处理。请求转发到服务上的时候也使用负载均衡。
5:服务之间有时候也需要相互访问。例如有一个用户模块,其他服务在处理一些业务的时候,要获取用户服务的用户数据。
6:需要一个断路器,及时处理服务调用时的超时和错误,防止由于其中一个服务的问题而导致整体系统的瘫痪。
7:还需要一个监控功能,监控每个服务调用花费的时间等。
目前主流的微服务框架:Dubbo、 SpringCloud、thrift、Hessian等
一:微服务简介(Microservice)
一.架构
1.创建一个SPRINGCLOUD项目
2.添加依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.17.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.创建模块:
SPRINGCLOUD_EUREKASERVER (注册中心)
SPRINGCLOUD_USERSERVICE (微服务)
SPRINGCLOUD_USERUI (客户端)
二.模块代码
1.SPRINGCLOUD_EUREKASERVER模块
首先在pom.xml导入依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
EurekaServer.java:
@SpringBootApplication
//开启Eureka Server
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
new SpringApplicationBuilder(EurekaServer.class).web(true).run(args);
}
}
解释:
@EnableEurekaServer注解:是启用eureka的服务
@SpringBootApplication注解:
主要有3个注解:
1.@ComponentScan:这个主要有2个作用,组件扫描和自动装配;
2.@SpringBootConfiguration:这个注解主要是继承@Configuration注解,这个我们就是为了加载配置文件用
3.@EnableAutoConfiguration:自动生成spring的配置文件
application.yml资源文件:
#指定端口,默认是8761,不要改变
server:
port: 8761
eureka:
instance:
#将来注册到注册中心的微服务包括注册中心都是用ip地址
prefer-ip-address: true
hostname: localhost
client:
#是否注册到注册中心 (注册中心自己不需要注册)
register-with-eureka: false
#是否抓取注册中的注册信息
fetch-registry: false
#微服务和客户端用来注册和发现的地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
运行main方法,再进入浏览器查询:http://localhost:8761/
2.SPRINGCLOUD_USERSERVICE模块
首先在pom.xml导入依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
UserService.java:
@SpringBootApplication
// 启用eureka的客户端
@EnableEurekaClient
public class UserService {
public static void main(String[] args) {
new SpringApplicationBuilder(UserService.class).web(true).run(args);
}
}
application.yml资源文件:
server:
port: 8881
#给微服务设置一个名字
spring:
application:
name: userservice
#连接数据库
datasource:
url: jdbc:mysql://localhost/mysql
username: root
password: ps123456
driver-class-name: com.mysql.jdbc.Driver
eureka:
instance:
prefer-ip-address: true
hostname: localhost
client:
register-with-eureka: true
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka/
mapper包下的 UserMapper.java:
// 根据账户和密码查询mysql数据库中user表的信息
@Mapper
public interface UserMapper {
@Select("select * from user where user=#{userName} and authentication_string=password(#{password})")
public List<User> queryUser(@Param("userName") String userName, @Param("password")String password);
}
entity包下的User.java实体类:
@Data
@NoArgsConstructor
public class User {
private String userName;
private String password;
}
解释:
1.@Data注解:生成属性的set,get方法
2.@NoArgsConstructor注解:生成构造方法
entity包下的Result.java 实体类:
// 要返回的实体类
@Data
@NoArgsConstructor
public class Result {
private int code;
private String msg;
private List data;
}
controller包下的UserController.java:
@RestController public class UserController {
@Autowired UserMapper usermapper; @PostMapping("/validateUser") public Result validateUser(@RequestBody User user){ List<User> maps = usermapper.queryUser(user.getUserName(), user.getPassword()); // 将获得的数据经过逻辑验证返回给界面微服务的控制层 Result re = new Result(); if(maps.size()>0){ re.setCode(1); re.setMsg("请输入正确的用户名和密码"); } return re; }
解释:
1.@RestController的作用就相当于@Controller+@ResponseBody的结合体
--@Controller:扫描控制层
--@ResponseBody:表示返回的类型是个JSON数据
2.@RestController: 接收客户端传来的数据
3.SPRINGCLOUD_USERUI模块
首先在pom.xml导入依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
application.yml资源文件:
#界面一般是80端口
server:
port: 80
#给登录微服务设置一个名字
spring:
application:
name: userui
eureka:
instance:
prefer-ip-address: true
hostname: localhost
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka/
com.ps包下的UserUi.java:
@SpringBootApplication // 启用eureka的客户端 @EnableEurekaClient public class UserUi {
@Bean // 支持负载均衡功能 @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { new SpringApplicationBuilder(UserUi.class).web(true).run(args); }
entity包下的User.java:
@Data
@NoArgsConstructor
public class User {
private String userName;
private String password;
Result.java:
@Data
@NoArgsConstructor
public class Result {
private int code;
private String msg;
private List data;
}
controller包下的UserController.java:
@Controller public class UserController {
@Autowired RestTemplate restTemplate; @PostMapping("/rlogin") public String rlogin(User user){ // 需要调用userservice这个微服务,注册中心里面服务名是大写 // validateUser:指要转跳的微服务的控制层的路径 String url = "http://USERSERVICE/validateUser"; // user:将user获取的数据传到微服务 // Result.class:指微服务返回的类型 ResponseEntity<Result> objectResponseEntity = restTemplate.postForEntity(url,user ,Result.class); Result body = objectResponseEntity.getBody(); // 当重微服务得到的Result对象的数据中code属性是1时表示,登录成功 if(body.getCode()==1){ return "redirect:/suc.html"; }else{ return "redirect:/login.html"; } }
解释:@Controller:指定返回的html界面,必须是重定向转跳
login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--这里是登录界面-->
<form method="post" action="rlogin">
<label>用户名</label>
<input name="userName"/><br>
<label>密 码</label>
<input name="password"/><br>
<input type="submit" value="登录"/>
</form>
</body>
</html>
suc.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--登录成功展示-->
登录成功
</body>
</html>
三.效果展示
1.依次运行SPRINGCLOUD_EUREKASERVER(注册中心),SPRINGCLOUD_USERSERVICE(微服务),SPRINGCLOUD_USERUI(客户端)
2.去注册中心查看微服务:http://localhost:8761/
浏览登录界面:
输入账户和密码登录后: