标签:new serve pos xml文件 基于 value nap 框架 名称
SpringCloud介绍: 1. 什么是微服务? 微服务架构(Microservice Architecture)是一种架构概念,旨在将功能点进行比较细粒度的拆分, 拆成一个个可以独立运行和发布部署的独立系统。这些系统我们就称为微服务系统。微服务系统近乎完全解耦。 2. 微服务架构的实现技术: dubbo、spring cloud等; 3. spring cloud是什么? Spring Boot基于spring,擅长的是集成,把世界上最好的框架集成到自己项目中。而Spring Cloud是基于SpringBoot 开发而来,SpringCloud是一系列框架的有序集合,是把非常流行的微服务的技术整合到一起,是微服务架构的一站式技术解决方案。 4. spring cloud常用的组件: 注册中心:Eureka、consul、Zookeeper 负载均衡:Ribbon 熔断器:Hystrix 服务通信:Feign 网关:Gateway 配置中心 :config 消息总线:Bus、集成rabbitmq 5. spring boot和spring cloud的版本要对应。 6. RestTemplate: spring家族的RestTemplate,是一种实现系统之间通信的技术。spring cloud支持http协议,而RestTemplate内部封装了http客户端工具, 所以RestTemplate支持http协议。 7. RestTemplate使用场景演示,微服务中没有消费者和提供者,为了便于理解,这里使用消费者和提供者; 1.创建provider 1.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>com.it</groupId> <artifactId>it-restTemplate-provider</artifactId> <version>1.0-SNAPSHOT</version> <!--微服务架构中并没有provider和consumer,这里是为了便于理解--> <!--父工程--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> </parent> <dependencies> <!--web起步依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> </dependencies> </project> 2.启动类: package com.it; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * ToDo * * @author Lyle * @date 2020/4/2 */ @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class,args); } } 3. pojo package com.it.pojo; import java.io.Serializable; /** * ToDo * * @author Lyle * @date 2020/4/2 */ public class User implements Serializable { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 4. Controller类 package com.it.controller; import com.it.pojo.User; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * ToDo * * @author Lyle * @date 2020/4/2 */ @RestController @RequestMapping("/user") public class UserController { @RequestMapping("/getById/{id}") public User getById(@PathVariable(name = "id") Integer id){ User user = new User(); user.setId(id); user.setName("东方不败"); return user; } } 5. 配置文件:无,默认端口8080; 2.创建consumer 1.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>com.it</groupId> <artifactId>it-restTemplate-consumer</artifactId> <version>1.0-SNAPSHOT</version> <!--微服务架构中并没有provider和consumer,这里是为了便于理解--> <!--父工程--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> </parent> <dependencies> <!--web起步依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> </dependencies> </project> 2.启动类: package com.it; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; /** * ToDo * * @author Lyle * @date 2020/4/2 */ @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class,args); } @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } } 3. pojo package com.it.pojo; import java.io.Serializable; /** * ToDo * * @author Lyle * @date 2020/4/2 */ public class User implements Serializable { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 4. Controller类 package com.it.controller; import com.it.pojo.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * ToDo * * @author Lyle * @date 2020/4/2 */ @RestController @RequestMapping("/order") public class OrderController { @Autowired private RestTemplate restTemplate; @RequestMapping("/getInfo") public String getInfo(){ //调用provider,获取用户的数据 //自动发送请求,并将数据转成pojo User user = restTemplate.getForObject("http://localhost:8080/user/getById/123", User.class); System.out.println(user.getId()+":"+user.getName()); System.out.println("获取到了数据。。。。"); return "ok"; } } 5. 配置文件:application.yml server: port: 8081 8. Spring Data JPA: spring data jpa是一种持久层技术框架,内部封装了基本的CRUD,使用jpa,不需要写XML文件就可以实现基本的CRUD功能; spring data jpa的使用: 1. 使用注解,使pojo和数据库表建立映射: 在pojo类上加上如下注解: @Entity:表示这个POJO是和数据库表建立映射的POJO @Table(name = "tb_user"):指定数据库中对应的表,建立映射 在pojo的属性上加上如下注解: @Id:标记该属性为主键 @GeneratedValue(strategy = GenerationType.IDENTITY):标记主键自增策略 @Column(name = "username"):建立pojo属性和数据库表中列的映射,若属性名和数据库一致,可以不写 2. 创建Dao接口继承JpaRepository<>接口: 如下: User为数据库表对应的pojo; Integer为主键类型; 无需写基本的CRUD,因为JpaRepository内部封装了; @Repository public interface UserDao extends JpaRepository<User,Integer> { } 9. 模拟微服务使用场景:微服务中没有消费者和提供者,为了便于理解,这里使用消费者和提供者; 在上面的RestTemplate的使用中,尽管实现了系统之间的通信,但是实现时,却将URL写死了,这样可扩展性和可维护性都受限, 因此,类似zookeeper一样,我们使用spring cloud eureka作为注册中心,使用推拉机制实现动态获取IP和端口。 1. 创建父工程parent,用于统一管理springboot和springcloud依赖的版本; 1. 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>com.it</groupId> <artifactId>it-springcloud-parent</artifactId> <version>1.0-SNAPSHOT</version> <description>父工程,管理springboot和springcloud的版本</description> <modules> <module>user-provider</module> <module>user-consumer</module> </modules> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> </parent> <!--SpringCloud包版本依赖管理--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project> 2. 创建eureka-server作为Eureka的服务端: 1. pom文件:导入eureka-server依赖 <?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>it-springcloud-parent</artifactId> <groupId>com.it</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>it-eureka-server</artifactId> <description>eureka服务端</description> <dependencies> <!--eureka-server依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> </project> 2. 创建启动类,并使用注解@EnableEurekaServer表明这是Eureka的服务端 package com.it; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * ToDo * * @author Lyle * @date 2020/4/3 */ @SpringBootApplication @EnableEurekaServer//表明这是Eureka的服务端 public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class,args); } } 3. 配置文件:application.yml: server: port: 7001 eureka: client: register-with-eureka: false #是否将自己注册到Eureka中 fetch-registry: false #是否从eureka中获取服务信息 service-url: defaultZone: http://localhost:7001/eureka # EurekaServer的注册地址,Eureka的客户端通过改地址进行注册 spring: application: name: eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId) 2. 创建微服务user-provider,为了便于理解,可以理解为服务端: 1. 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>it-springcloud-parent</artifactId> <groupId>com.it</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-provider</artifactId> <!--假设该系统为用户系统,提供用户的相关信息--> <dependencies> <!--JPA包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--web起步包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--MySQL驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </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-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> </project> 2. 创建启动类,并使用注解@EnableEurekaClient表明这是Eureka的客户端 package com.it; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; /** * ToDo * * @author Lyle * @date 2020/4/3 */ @SpringBootApplication @EnableEurekaClient//表示该服务是Eureka的客户端 public class UserProviderApplication { public static void main(String[] args) { SpringApplication.run(UserProviderApplication.class,args); } } 3. 创建pojo并与数据库表建立映射: package com.it.pojo; import javax.persistence.*; import java.io.Serializable; import java.util.Date; /** * ToDo * * @author Lyle * @date 2020/4/3 */ @Entity//表示这个POJO是和数据库表建立映射的POJO @Table(name = "tb_user")//指定数据库中对应的表,建立映射 public class User implements Serializable { @Id//标记该属性为主键 @GeneratedValue(strategy = GenerationType.IDENTITY)//标记主键自增策略 private Integer id;//主键id @Column(name = "username")//若属性名和数据库一致,可以不写 private String username;//用户名 private String password;//密码 private String name;//姓名 private Integer age;//年龄 private Integer sex;//性别 1男性,2女性 private Date birthday; //出生日期 private Date created; //创建时间 private Date updated; //更新时间 private String note;//备注 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getSex() { return sex; } public void setSex(Integer sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public Date getCreated() { return created; } public void setCreated(Date created) { this.created = created; } public Date getUpdated() { return updated; } public void setUpdated(Date updated) { this.updated = updated; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } } 4. 创建Controller类: package com.it.controller; import com.it.pojo.User; import com.it.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * ToDo * * @author Lyle * @date 2020/4/3 */ @RestController @RequestMapping(value = "/user") public class UserController { @Autowired private UserService userService; @RequestMapping(value = "findAll") public List<User> findAll(){ return userService.findAll(); } @RequestMapping(value = "findByUser") public User findByUser(){ return userService.findAll().get(0); } } 5. 创建service接口及实现类: 接口: package com.it.service; import com.it.pojo.User; import java.util.List; /** * ToDo * * @author Lyle * @date 2020/4/3 */ public interface UserService { List<User> findAll(); } 实现类: package com.it.service.impl; import com.it.dao.UserDao; import com.it.pojo.User; import com.it.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * ToDo * * @author Lyle * @date 2020/4/3 */ @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public List<User> findAll() { return userDao.findAll(); } } 6. 创建Dao接口继承JpaRepository package com.it.dao; import com.it.pojo.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; /** * ToDo * * @author Lyle * @date 2020/4/3 */ @Repository public interface UserDao extends JpaRepository<User,Integer> { } 3. 创建微服务user-consumer,为了便于理解,可以理解为消费端: 1. pom文件:导入eureka-client依赖 <?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>it-springcloud-parent</artifactId> <groupId>com.it</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-consumer</artifactId> <!--假设该系统为电影微服务系统,需要获取用户信息--> <dependencies> <!--web起步包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--eureka客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> </project> 2. 创建启动类,并使用注解@EnableEurekaClient表明这是Eureka的客户端 package com.it; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; /** * ToDo * * @author Lyle * @date 2020/4/3 */ @SpringBootApplication @EnableEurekaClient public class UserConsumerApplication { public static void main(String[] args) { SpringApplication.run(UserConsumerApplication.class,args); } @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } } 3. 配置文件:application.yml server: port: 18082 spring: application: name: user-consumer eureka: client: register-with-eureka: true #是否将自己注册到Eureka中,可以不配,默认为true fetch-registry: true #是否从eureka中获取服务信息,可以不配,默认为true service-url: defaultZone: http://localhost:7001/eureka # 注册到EurekaServer端的地址 4. 创建Controller类:向微服务user-provider发送请求,获取user-provider查询到的信息: package com.it.controller; import com.it.pojo.User; 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.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.List; /** * ToDo * * @author Lyle * @date 2020/4/3 */ @RestController @RequestMapping("/movie") public class MovieController { @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @RequestMapping("/look/{username}") public String look(@PathVariable(name = "username") String username){ //接收用户信息 // User user = restTemplate.getForObject("http://localhost:18081/user/findByUser", User.class); List<ServiceInstance> instances = discoveryClient.getInstances("user-provider"); ServiceInstance serviceInstance = instances.get(0); User user = restTemplate.getForObject("http://" +serviceInstance.getHost()+":"+serviceInstance.getPort() +"/user/findByUser", User.class); System.out.println(username+"===========>"+user.getName()); return "success"; } }
标签:new serve pos xml文件 基于 value nap 框架 名称
原文地址:https://www.cnblogs.com/lyle-liu/p/12627955.html