# demo **Repository Path**: chenlushun/demo ## Basic Information - **Project Name**: demo - **Description**: demo - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-03-13 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 微服务demo # =========================== ## 模块介绍 * demo-spring-cloud spring-cloud相关demo * demo-spring-boot spring-boot相关demo * demo-dubbo spring boot整合dubbo * demo-docker-maven 利用docker构建微服务示例 ### demo-spring-boot ### ------------ spring-boot相关demo,spring boot突破了以往所有访问数据库的方法,实现了更高级的访问方法。使开发者更为简单的开发应用。 #### demo-spring-boot-jdbc spring boot中使用mysql数据库 本例子演示spring boot中如何操作mysql数据库。 构建一个用户部门角色的实际案例来演示 pom文件中添加一下配置 ```xml org.springframework.boot spring-boot-starter-data-jpa mysql mysql-connector-java ``` application.yml中配置信息 ```properties #服务器端口 server: port: 8010 spring: #数据库配置 datasource: url: jdbc:mysql://localhost:3306/ytx_api username: root password: 123456 jpa: database: MYSQL show-sql: true hibernate: ddl-auto: update #naming_strategy: naming: strategy: org.hibernate.cfg.ImprovedNamingStrategy implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy properties: hibernate: dialect: org.hibernate.dialect.MySQL5Dialect ``` User实体 ```java @Entity @Table(name = "user") @Data public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createdate; @ManyToOne @JoinColumn(name = "did") // @JsonBackReference private Department department; @ManyToMany(cascade = {}, fetch = FetchType.EAGER) @JoinTable(name = "user_role", joinColumns = {@JoinColumn(name = "user_id")}) private List roles; } ``` 角色实体 ```java @Entity @Table(name = "role") @Data public class Role implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; } ``` 部门实体 ```java @Entity @Table(name = "department") @Data public class Department implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; } ``` jpa配置信息 ```java @Order(Ordered.HIGHEST_PRECEDENCE) @Configuration //启动jpa的事务管理 @ComponentScan @EnableTransactionManagement(proxyTargetClass = true) //启动jpa的资源库,并制定资源库的位置 @EnableJpaRepositories(basePackageClasses = {UserRepository.class, DepartmentRepository.class, RoleRepository.class}) //指定实体的位置,两种方式 //@EntityScan(basePackageClasses = {User.class, Role.class, Department.class}) @EntityScan(basePackages = "demo.spring.boot.jdbc.**") public class JpaConfig { public JpaConfig() { } @Bean public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() { return new PersistenceExceptionTranslationPostProcessor(); } } ``` 部门Repository ```java @Repository public interface DepartmentRepository extends JpaRepository { } ``` 用户Repository ```java @Repository public interface UserRepository extends JpaRepository { } ``` 角色Repository ```java @Repository public interface RoleRepository extends JpaRepository { } ``` 写一个Controller ```java @RestController @RequestMapping public class DemoController { private static Logger logger = LoggerFactory.getLogger(DemoController.class); @Autowired UserRepository userRepository; @Autowired DepartmentRepository departmentRepository; @Autowired RoleRepository roleRepository; @RequestMapping("/1") public void save() { userRepository.deleteAll(); departmentRepository.deleteAll(); roleRepository.deleteAll(); Department department = new Department(); department.setName("开发部"); departmentRepository.save(department); Role role = new Role(); role.setName("admin"); roleRepository.save(role); Assert.assertNotNull(role.getId()); User user = new User(); user.setName("张三"); user.setCreatedate(new Date()); user.setDepartment(department); List roleList = roleRepository.findAll(); Assert.assertNotNull(roleList); user.setRoles(roleList); userRepository.save(user); Assert.assertNotNull(user); } @RequestMapping("/2") public Page findPage() { Pageable pageable = new PageRequest(0, 10, new Sort(Sort.Direction.ASC, "id")); Page page = userRepository.findAll(pageable); Assert.assertNotNull(page); for (User user : page.getContent()) { logger.info(user.getName()); } return page; } } ``` 浏览器中访问:http://localhost.ytx.cc:8010/2 返回结果: ```json { content: [ { id: 2, name: "张三", createdate: 1492254026000, department: { id: 2, name: "开发部" }, roles: [] } ], last: true, totalElements: 1, totalPages: 1, size: 10, number: 0, sort: [ { direction: "ASC", property: "id", ignoreCase: false, nullHandling: "NATIVE", ascending: true, descending: false } ], first: true, numberOfElements: 1 } ``` 虽然我们没有写一条sql,但是已经实现了对user、department、role的crud,以及常见的查询,比如分页查询 ### demo-docker-maven #### ------------ #### 使用dockerfile构建docker镜像 在文件目录下面创建 Dockerfile ``` #基础镜像 FROM java:8 #将本地文件挂到当前容器 VOLUME /Users/chenlushun/yc-code/demo/demo-docker-maven/target/demo-docker-maven-1.0-SNAPSHOT.jar #拷贝文件到容器 ADD demo-docker-maven-1.0-SNAPSHOT.jar app.jar RUN bash -c "touch /app.jar" #暴露端口 EXPOSE 8761 #配置容器启动之后的命令 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"] ``` docker build -t eacdy/test1 .  # 格式:docker build -t 标签 名称 Dockerfile的相对位置  构建成功: Successfully built a7cc6f4de088 。 docker run -p 8761:8761 eacdy/t #运行docker容器 #### 使用maven构建微服务镜像 使用maven构建微服务镜像 maven插件地址:https://github.com/spotify/docker-maven-plugin ```xml com.spotify docker-maven-plugin 0.4.12 microservice-discovery-eureka java ["java","-jar","/${project.build.finalName}.jar"] / ${project.build.directory} ${project.build.finalName}.jar ``` 构建镜像 :mvn clean package docker:build ## 参考文献 * https://spring.io/guides/gs/spring-boot