• 第二章、dubbo 框架(dubbo 服务化最佳实践)


    2.6.1 分包
    建议将服务接口、服务模型、服务异常等均放在公共包中。
    2.6.2 粒度
           服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题, Dubbo 暂未提供分布式事务支持。
           服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸。
          不建议使用过于抽象的通用接口,如: Map query(Map) ,这样的接口没有明确语义, 会给后期维护带来不便。
    2.6.3 版本
           每个接口都应定义版本号,为后续不兼容升级提供可能,如:
          建议使用两位版本号,要变更服务版本。先升级一半提供者为新版本,再将消费者全部升为新版本,然后将剩下的一半提供者升为新版本。
    2.7 改造 dubbo 项目
            抽象分散在多个项目中的公共接口,实体类,异常,工具类到一个项目中,在其他项目如服务提供者,消费者共用公共的资源。
    功能实现
    1.新建model不使用maven框架

    2. User实体类

    1. package com.it.dubbo.entity;
    2. import java.io.Serializable;
    3. public class User implements Serializable {
    4. private Integer id;
    5. private String name;
    6. private Integer age;
    7. @Override
    8. public String toString() {
    9. return "User{" +
    10. "id=" + id +
    11. ", name='" + name + '\'' +
    12. ", age=" + age +
    13. '}';
    14. }
    15. public Integer getId() {
    16. return id;
    17. }
    18. public void setId(Integer id) {
    19. this.id = id;
    20. }
    21. public String getName() {
    22. return name;
    23. }
    24. public void setName(String name) {
    25. this.name = name;
    26. }
    27. public Integer getAge() {
    28. return age;
    29. }
    30. public void setAge(Integer age) {
    31. this.age = age;
    32. }
    33. }
    3.UserService接口
    1. package com.it.dubbo.service;
    2. import com.it.dubbo.entity.User;
    3. public interface UserService {
    4. User queryUserById(Integer id);
    5. Integer queryAllUserCount();
    6. }

    4.pom.xml文件

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.it.dubbogroupId>
    6. <artifactId>003-link-interfaceartifactId>
    7. <packaging>pompackaging>
    8. <version>1.0-SNAPSHOTversion>
    9. project>

    1.新建model使用maven的archet-webapp框架

    2.pom.xml文件

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    3. <modelVersion>4.0.0modelVersion>
    4. <groupId>com.it.dubbogroupId>
    5. <artifactId>004-link-userservice-providerartifactId>
    6. <version>1.0-SNAPSHOTversion>
    7. <packaging>warpackaging>
    8. <dependencies>
    9. <dependency>
    10. <groupId>org.springframeworkgroupId>
    11. <artifactId>spring-contextartifactId>
    12. <version>4.3.16.RELEASEversion>
    13. dependency>
    14. <dependency>
    15. <groupId>org.springframeworkgroupId>
    16. <artifactId>spring-webmvcartifactId>
    17. <version>4.3.16.RELEASEversion>
    18. dependency>
    19. <dependency>
    20. <groupId>com.alibabagroupId>
    21. <artifactId>dubboartifactId>
    22. <version>2.6.2version>
    23. dependency>
    24. <dependency>
    25. <groupId>com.it.dubbogroupId>
    26. <artifactId>003-link-interfaceartifactId>
    27. <version>1.0-SNAPSHOTversion>
    28. dependency>
    29. dependencies>
    30. <build>
    31. <plugins>
    32. <plugin>
    33. <artifactId>maven-compiler-pluginartifactId>
    34. <version>3.1version>
    35. <configuration>
    36. <source>1.8source>
    37. <target>1.8target>
    38. configuration>
    39. plugin>
    40. plugins>
    41. build>
    42. project>

    3.接口实现类userServiceImpl

    1. package com.it.dubbo.service.impl;
    2. import com.it.dubbo.entity.User;
    3. import com.it.dubbo.service.UserService;
    4. import java.util.UUID;
    5. public class UserServiceImpl implements UserService {
    6. @Override
    7. public User queryUserById(Integer id) {
    8. User user = new User();
    9. user.setId(id);
    10. user.setName("小王");
    11. user.setAge(22);
    12. return user;
    13. }
    14. @Override
    15. public Integer queryAllUserCount() {
    16. return 666;
    17. }
    18. }

    4.dubbo-userservice-provider配置文件

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    3. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    4. <dubbo:application name="004-link-userservice-provider"/>
    5. <dubbo:protocol name="dubbo" port="20880"/>
    6. <dubbo:service interface="com.it.dubbo.service.UserService" ref="userService" registry="N/A"/>
    7. <bean id="userService" class="com.it.dubbo.service.impl.UserServiceImpl"/>
    8. beans>

    5.web.xml配置文件

    1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    4. version="4.0">
    5. <context-param>
    6. <param-name>contextConfigLocationparam-name>
    7. <param-value>classpath:dubbo-userservice-provider.xmlparam-value>
    8. context-param>
    9. <listener>
    10. <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    11. listener>
    12. web-app>

    1.新建model使用maven的archety框架

    2.UserController类

    1. package com.it.dubbo.web;
    2. import com.it.dubbo.entity.User;
    3. import com.it.dubbo.service.UserService;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Controller;
    6. import org.springframework.ui.Model;
    7. import org.springframework.web.bind.annotation.RequestMapping;
    8. @Controller
    9. public class UserController {
    10. @Autowired
    11. private UserService userService;
    12. @RequestMapping(value = "/userDetail")
    13. public String userDetail(Model model,Integer id){
    14. //根据用户标识获取用户详情
    15. User user = userService.queryUserById(id);
    16. //获取用户总人数
    17. Integer integer = userService.queryAllUserCount();
    18. model.addAttribute("user",user);
    19. model.addAttribute("i",integer);
    20. return "userDetail";
    21. }
    22. }

    3.applicatContext.xml配置文件

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:context="http://www.springframework.org/schema/context"
    4. xmlns:mvc="http://www.springframework.org/schema/mvc"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    6. <context:component-scan base-package="com.it.dubbo.web"/>
    7. <mvc:annotation-driven/>
    8. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    9. <property name="prefix" value="/"/>
    10. <property name="suffix" value=".jsp"/>
    11. bean>
    12. beans>

    4.dubbo-consumer.xml配置文件

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    3. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    4. <dubbo:application name="005-link-consumer"/>
    5. <dubbo:reference id="userService" interface="com.it.dubbo.service.UserService"
    6. url="dubbo://localhost:20880" registry="N/A"/>
    7. beans>

    5.web.xml配置文件

    1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    4. version="4.0">
    5. <servlet>
    6. <servlet-name>dispatcherServletservlet-name>
    7. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    8. <init-param>
    9. <param-name>contextConfigLocationparam-name>
    10. <param-value>classpath:applicationContext.xml,classpath:dubbo-cunsumer.xmlparam-value>
    11. init-param>
    12. servlet>
    13. <servlet-mapping>
    14. <servlet-name>dispatcherServletservlet-name>
    15. <url-pattern>/url-pattern>
    16. servlet-mapping>
    17. web-app>

    6.userDetail.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>用户详情title>
    5. head>
    6. <body>
    7. <h3>用户详情h3>
    8. <div>用户标识:${user.id}div>
    9. <div>用户姓名:${user.name}div>
    10. <div>用户年龄:${user.age}div>
    11. <div>用户总人数:${i}div>
    12. body>
    13. html>

    1.配置tomcat服务器

     

     

     

    功能测试:

     

     

     

  • 相关阅读:
    前端培训丁鹿学堂分享:vue3之hook函数和toRef组合式API使用
    ISTQB术语表
    网络技术在学校是学习网络协议吗
    基于vue-tianditu实现瓦片数据层添加
    gcc 和 g++的区别
    简述 HTML 的语义化标签是什么?
    VSCODE解决git合并过程中的冲突问题;error: failed to push some refs to
    Flink SQL 在kerberos on yarn环境下提交
    人家网站都免费了,你还用Python去爬?
    TensorRT C# API 项目更新 (1):支持动态Bath输入模型推理
  • 原文地址:https://blog.csdn.net/weixin_59334478/article/details/126312108