Ahead
As a Java programmer, why don't I turn to go in a production project?
Since Google released the first official version of the Go language in 2009, the language has been popular with excellent language features, especially in situations where high concurrency is required, and everyone will think about whether to use go. Then, in the domestic emergence of a group of seven cattle as a representative of the use of go as the main language team, and Kosebe great God himself in various occasions to push go in the domestic development, so in this environment, China's go developer community gradually surpassed the other regions.
Then the problem comes, spare time to learn is one thing, really want to use a new things in production is another matter. JavaScript developers can choose node. js as a no-no-no-no, but for Java developers, is it the choice of Go or Java for the next big project?
As a Java programmer, why don't I turn to go in a production project?
Language itself
First of all, it needs to be explained that as a technical decision-maker, it is not possible to make a direct conclusion according to the characteristics of the language in the technology selection. In fact, most people will use a series of frameworks, libraries and tools, in short, will consider a lot of surrounding ecological environment factors, but also combined with the company's characteristics, a variety of historical issues and actual objective factors, such as a series of considerations to complete the decision-making. So, let's start with the language and step-by-step analysis of whether it's appropriate to choose Go in your project.
Go is undoubtedly superior in high-concurrency programming, supported by Goroutine from the language level, which is unmatched by languages such as Java, which is one of the most important reasons why most people choose go for high concurrency scenarios. Although Java has a framework such as Kilim, there is no language layer support that is always lesser.
In addition, the other syntax of Go is also very interesting, such as multiple return value, to some extent for developers to bring some convenience. Imagine, in order to return two to three values, have to encapsulate an object, or erase the business name using the map, list and other collection classes, advanced point with Apache pair and triple, although feasible, but always not as elegant as the implementation of go. On top of that, go also unifies the abnormal return way, does not have to tangle is by throws the exception or the error code to judge whether succeeds, the multiple return value the last is the error to be OK.
Go in the native type of language supports some commonly used structures, such as map and slice, and other languages they are more in the library, which also shows that the language is from a practical point of view, since everyone needs, why not support it at the language level. function as a class citizen appears in the go language, but Java in the recent Java 8 also has a lambda expression, is also a progress.
Other features that are icing on the cake, such as indefinite parameters, have been supported by VarArgs in Java 1.5 in 2004; Multiple assignments are also present in Ruby, but in addition to assigning multiple return values, and letting you write less than one intermediate variable when exchanging values, make the code more aesthetically pleasing , the other effect is really not how obvious.
Said so many advantages of go, of course, it also has some problems, such as GC, speaking of it, Java has to reveal the white teeth, although in the large heap of GC G1 still somewhat unsatisfactory, but Java GC has been developed for many years, various strategies are more mature, CMS or G1 enough to cope with most scenes, There is a real need to use the Azul Zing JVM. However, from the latest Go 1.5 news, GO's GC implementation has greatly improved, by the way, Gomaxprocs by default from 1 to the CPU core, it seems that the official go on the use of multi-core more confidence.
Xu Shiwei in the preface to "Go Language programming" predicted the next 10 years, go will replace Java, ranked in the top of the programming list, was 2012, in order to see the 2009 year Tiobe year of programming language today's rankings, the author in writing this article deliberately to Tiobe to see the next, the most recent August 2015 ranking , Java ranked first in 19.274%, and go has fallen out of the top 50, which makes some surprises.
But overall, I think go in the language level of performance is quite good, to solve some of the pain points in programming, learning curve can be accepted, especially for those who have a/C + + background, will feel very cordial.
Engineering issues
A person to write code can be very casual, how to write on how to write, but when a person into a team, this random or casually will bring a lot of problems, so the birth of coding norms this thing, the big companies have their own coding standards, such as Google has no more than 10 programming language specifications. A set of coding specifications within a team can largely ensure the style of the code and reduce the cost of reading communication. Go built-in a set of coding specifications, violate the code can not be compiled through, it is said that as long as you are writing go, then your code will not be too ugly, of course, go does not put everything on the forced death, and some of the recommended specifications can be formatted by GOFMT, but this step is not necessary.
Although go itself solves this problem, but can not say that Java is blank in this area, Java development So far around the tools, there is no shortage of mature code static analysis tools, such as Checkstyle, PMD and findbugs, they can not only scan the coding specifications of the problem, It is even possible to scan the code for potential problems and to give solutions, and to be easy to use, and to have a high degree of acceptance in the Java developer community, it should be said that most of the developers will use these tools. In addition, some manufacturers also have their own coercive means, such as Baidu Internal also has a lot of language coding norms, and in most cases, if not through the coding standard Scan, you are unable to submit code, and some companies in the continuous integration process to add code scanning, A problem with findbugs high priority must be repaired before it can enter the next phase. So the advantage of go on this issue is not obvious, or in a mature environment, this is only qualified.
Here we need to emphasize one of the views of the author:
Go incorporates a number of best practices in the language itself and in the release package, and it is the experience of these predecessors that makes it look so good. Take such a sea, land and air mixed special forces to the Java, C, Ruby, the language itself to do contrast, it seems unfair, so this article in the consideration of the problem will be combined with the language and its ecosystem members, after all, this is closer to the real situation.
Go itself has a set of conventions on the structure of the project, where the code put, how to name the test file, compile the packaged results output to which directory, and even the go cover this statistical test coverage of the command line, the developer does not have to be too tangled in these issues, once again embodies the go focus on engineering practice characteristics. Back to the Java side, MAVEN and Gradle are all tools that focus on project lifecycle management, and Maven is a long-standing and widely used project. To Maven, for example, not only to achieve all of the above features, there is a strong plug-in extension capabilities, here is just a one-time maintenance of the Pom.xml file on the line, because the use of MAVEN is very large, there are a lot of examples on the web, and even a lot of engineering tools and templates, so the cost is not high.
Here also to derive a topic, is to rely on management, in the development of code, it is bound to rely on a lot of external things, go can directly import remote content, this feature is very creative, but does not solve the problem of version, in Maven or Gradle, We can directly specify the individual dependencies or even the plug-in version, and the tool will automatically download them from the repository. If it is necessary to rely on different versions of the same library in different modules of the same system at the same time, we can also be implemented by OSGi, a slightly more sophisticated means, in terms of modularity, although Jagsaw is deferred, but is expected to be included in Java 9, this feature will solve a lot of problems. And according to the Golang practice group in the discussion, it seems that godep, GB and GVT are not satisfactory, in this regard go still have a way to go.
To sum up, go in the engineering has a lot of bright spots, absorbing a lot of best practices, and even can say with go after more easy to write code, there is a good project structure, but with the complete ecosystem of Java, go is not the dominant, because the quality of the final code is decided by the people, both sides are not lack of good tools, Therefore, the characteristics of this aspect can not affect the decision-making of technology selection.
Development practices
Talk is cheap. Show me the code.
Enter the coding link below, first from the go proud of the concurrency began, "Go language Programming" in the preface has such a code:
As a Java programmer, why don't I turn to go in a production project?
The Java code in the book is 12 lines, and the thread, not the association, is obvious, but it was in 2012, and today, Java has grown to Java 8, 3 years, to see what the Java code looks like today:
As a Java programmer, why don't I turn to go in a production project?
Not a co-process is still a mishap, but with a lambda expression, the code is a lot shorter. But then again, this comparison does not have much meaning, so you do not have to stand out go to say go also support closures, go version can also be streamlined. We do not write short, in Java practice, most of the time people will choose the thread pool, rather than their own new thread object, Doug Lea great God's Java and the contract is very useful, and very reliable. In addition, the content of the concurrency is the key, city a thread or the process is the first step of the XXX Great Wall, if there are 10 branches of business logic, but also multiple access to the database and call remote services, that no matter what language is useless. So in the case of complex business logic, the difference in language is not too obvious, at least in the Java and go contrast is not obvious, as for other higher-level, more expressive language (such as common Lisp), we will have to spell IQ.
In some cases, due to objective factors constraints, completely can not use go, such as now in full swing in the Internet financial system, and the bank docking system almost no choice, are Java implementation, because some banks will only give jar package ah ... To the jar bag ah ... Jar Bag Ah ... If it is a so file, perhaps can also use CGO to cope with, face a jar you let go what to do?
Put aside these annoying questions, let's take a look at the more common ways to implement rest services now. When it comes to this, we must sacrifice the Beego framework of the people who go abroad. One of the simplest rest services can be this:
As a Java programmer, why don't I turn to go in a production project?
Since the go aspect, we use a set of framework, then Java aspect, we also choose a mature framework, spring in Java EE Basic can be regarded as the fact standard, and spring boot is greatly improved the development efficiency of spring project, See how the same rest service is implemented in Springboot.
First of all, to start.spring.io build the skeleton of the project as needed (in fact it can be easily manually configured by MAVEN or created with CLI tools), for subsequent demonstrations, here I will choose "Web", "Actuator" and "Remote Shell, in fact, is more than two Maven dependency, the following operations Section will mention, and then casually find a handy IDE to open the project, type the following code on the line (import, package and class definition of the basic is the IDE generated).
As a Java programmer, why don't I turn to go in a production project?
Running this code will automatically launch the built-in tomcat container and access the http://localhost:8080/
You can see the output. Because it is spring, there is no pressure to mix with other framework facilities, and there is not much to learn.
It can be seen that there is not much difference between the two in implementing rest services, and in addition to the business logic issues mentioned above, there is no qualitative difference between languages if the right tools are used.
The ORM in Beego supports MySQL, PostgreSQL, and Sqlite3, while ORM tools such as Hibernate and MyBatis in Java can almost take the most common relational databases and are quite mature, The community is equipped with a variety of auto-generating tools to simplify use, and the industry also has a recognized standard like JPA. Throughout the Go ORM tool, we are still in the discussion, which is to use it? To NoSQL, both sides have a large number of drivers to use, such as MongoDB and Redis have a detailed list of drivers, MongoDB is not officially driven, but there is community maintenance of MgO, is a tie bar. A little bit larger, like Hadoop, Spark, and storm scenarios, it seems that Java has a higher rate of out-of-the-way, or it is solved directly by means of streaming, and this is no longer unfolding.
While there are so many questions, go is a good choice if you really encounter large traffic, high concurrency scenarios, and need to develop the infrastructure from scratch to deal with these issues. For example, a cloud service provider such as seven cattle, or BFE (Baidu Front End, claiming to be probably the world's largest go language cluster, left its figure in the Velocity conference in 2015--figures 1 and 2).
Operation and Maintenance
Write the code is just xxx Long march of a small step, behind there is a lot of things waiting for you to solve, such as how to write finished code compiled, packaged, released on-line. Compile and pack without saying, Go's command-line tool go build can directly put your code together with all its dependencies into an executable file. As for deployment, everyone praised that go deployment is not dependent (in addition to the GLIBC version of the requirements, regardless of the need for CGO), directly to the executable file there to throw it, very convenient. Go has built-in powerful HTTP support that does not require additional Web servers to support you for good performance.
Looking at Java, it's common sense to use MAVEN or Gradle to handle compilation, packaging, and even publishing, and in Maven's case, the MVN package can be compiled and packaged. You can choose a jar package, which can be a war package if a Web project is deployed to a container, or it can be packaged together into a compressed package (zip, tar, and so on), which is not a complex step.
The next deployment, we have something to say, "Write Once, Run Anywhere" This was a Java propaganda, but it is this sentence has been criticized, in fact, if the code does not use platform-specific content (such as to avoid binding on WebLogic), The internal classes that do not use a particular version of the JDK (such as Com.sun, which is not recommended), Java code can be compiled and run anywhere, in fact, most of the time, we are doing so, to see the vast number of Java libraries are released Jar to maven warehouse, but also No one asked you to directly pull the source code to compile. In a different environment, you just need to deploy the corresponding JDK (usually put in the installed template, or directly with the installation package to deploy it), as to what the operating system is not really important.
Continuation of the rest service example above, Java Web Projects are generally deployed in containers, such as Tomcat or jetty, of course, also useful for commercial containers (many banks are used WebLogic), so we all think that the deployment of Java programs need to first have a container, This is actually a few years ago, and then blew up a wave of embedded containers, Tomcat and jetty can be embedded in your program, no longer have to worry about having a container. Spring Boot simply makes this a little easier, after the MVN package, a word will be able to take care of the boot of the built-in Tomcat, complete the various deployments, and then everything becomes the following (assuming that the last generated jar is named Demo.jar):
As a Java programmer, why don't I turn to go in a production project?
In spring Boot 1.3, you can also adjust the configuration of Maven plugin so that the jar can be executed directly (don't underestimate the change, it can greatly improve the operational dimension):
As a Java programmer, why don't I turn to go in a production project?
So Java program difficult to deploy is also history, now Java program deployment is already a different condition. The compilation, packaging, and deployment of the two can be completely tied. I think some aspects of Java is better, such as Java basically do not have to worry about cross-compilation problem; Go library in the release of the recommended direct release of the source code rather than the binary package, encountered in the celestial network can not access the situation, compile something to bring the xxx ... As for the conjunction with Nginx and so on, it is very convenient for everyone, will not repeat it.
The completion of the deployment, the next log and monitoring, are very common problems, the log has a corresponding library, and monitoring are dependent on professional monitoring platform, their own information output is good, please allow me to show the spring boot Remoteshell terminal monitoring, In addition to the regular HTTP output JSON information (with the health check, meter data, Dump, request tracking and a series of rest output), but also brought a similar top of the tall thing, Ssh-p 2000 User@localhost after execution dashboard can see this real-time update of the interface.
Summarize
So much to summarize the full text of the view-although go in the language is very good, but also into a lot of best practices, but combined with many considerations, in many cases it will not be more valuable than Java, and may not necessarily be able to do better than Java, so as a Java programmer, I will not turn to go in my own production project.
In addition, in addition to the issues discussed in this article, there are more realistic issues, such as team transition costs and recruitment costs, do not underestimate the recruitment, for managers, recruitment is also an important part of the work, imagine, is to recruit an experienced go programmer easy, Or is it easy to recruit an experienced Java programmer, and even if you can recruit a full-time employee of Go, can you recruit a go outsourcing, especially if the team is in need of fresh blood, the result is obvious.
But all this does not prevent everyone to learn go, the beginning of this article has expressed this point of view, spare time to learn go and in the production project without go is not conflict, go still have a lot of learning and learn from the place, and who is not sure which day you will really meet the right to use the Go project.
Like the small part to pay attention to it!